思路:排序后按照二分查找的思想来做。也就是,每次固定i,用二分查找从i+1到n-1查找m-list[i],若存在,则输出。
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> list1;
bool cmp(int x, int y)
{
return x < y;
}
int main()
{
int n, m, k;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &k);
list1.push_back(k);
}
//Vector的排序要注意和数组的区别
sort(list1.begin(), list1.end(), cmp);
int i, left, right, mid;
bool flag = false;
for(i = 0; i < n; i++)
{
left = i+1, right = n-1;
flag = false;
while(left <= right)
{
mid = (left+right) / 2;
if(m-list1[i] == list1[mid])
{
flag = true;
break;
}
else if(m-list1[i] < list1[mid])
right = mid-1;
else
left = mid+1;
}
if(flag)
break;
}
if(flag)
printf("%d %d\n", list1[i], list1[mid]);
else
printf("No Solution\n");
return 0;
}