二分法,取左右指针
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include<algorithm>
using namespace std;
int main()
{
string s;
int i = 0;
vector<int> a(10000);
//输入一串数字,可包括负数
getline(cin, s);
stringstream ss(s);
//将其转化为数组
while (ss >> a[i])
{
i++;
}
//从小到大排序
sort(a.begin(), a.begin()+i);
//l,r分别为左右指针,pre存放和,tl、tr为真正的答案的位置
int l = 0, r = i - 1, pre = 9999999, tl = 0, tr = i - 1;
int sum = 0;
//二分法
while ((l < r) && (l != r))
{
sum = a[l] + a[r];
//当和比之前的小,且为正,取两个位置,并且右边指针左移
if (sum > 0 && sum <= pre)
{
tl = l;
tr = r;
r--;
pre = sum;
}
//正,没有以前小,左指针右移
else if (sum > 0 && sum > pre)
{
l++;
}
//负,比以前小,取位置,右指针左移
else if (sum < 0 && -sum < pre)
{
pre = -sum;
tl = l;
tr = r;
r--;
}
//负,没有以前小,左指针右移
else {
l++;
}
}
cout << a[tl] <<" " << a[tr] << " " << pre << endl;
return 0;
}