值得学习的是lower_bound的用法,作用是寻找数组中第一个大于等于某个数的位置,返回的是位置的地址,减去头地址后返回的是数组的下标。
使用形式:int p=lower_bound(a,a+n,ans)-a;
(1)p就是数组a中大于等于ans这个数字的第一个元素的下标。
(2)a是数组名或数组首地址,a,a+n指的是查找的地址范围。ans是目标的数字。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50005;
int num[maxn];
int n,k;
int main()
{
int flag=1;
scanf("%d%d",&k,&n);
for(int i=0; i<n; i++)
scanf("%d",&num[i]);
sort(num,num+n);
for(int i=0; i<n; i++)
{
int ans=k-num[i];
int p=lower_bound(num,num+n,ans)-num;
if(num[p]==ans)
{
if(p<=i)
break;
printf("%d %d\n",num[i],num[p]);
flag=0;
}
}
if(flag)
printf("No Solution\n");
return 0;
}