A数组排序,设b=K-A[i],然后在A里面二分查找b
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 5e4+10;
int num[MAXN];
bool mark[MAXN];//查找过的数字标记为true
int k,n;
bool bs(int number)
{
int l = 0;
int r = n-1;
int mid = (l+r)>>1;
while(l <= r)
{
if(number < num[mid])
r = mid-1;
else if(number > num[mid])
l = mid+1;
else if(number == num[mid])
{
if(!mark[mid])
{
mark[mid] = true;
return true;
}
else
return false;
}
mid = (l+r)>>1;
}
return false;
}
int main()
{
int a,b;
scanf("%d %d",&k,&n);
for(int i = 0; i < n; ++i)
scanf("%d",&num[i]);
sort(num,num+n);
bool flag = true;
for(int i = 0; i < n; ++i)
{
if(mark[i])
continue;
else
mark[i] = true;
a = num[i];
b = k - a;
if(bs(b))
{
printf("%d %d\n",a,b);
flag = false;
}
}
if(flag) printf("No Solution\n");
return 0;
}