题意:给你一个集合,每俩个数相加得到一个和s,输入s1,问离s1最近的s是多少
二分,注意如果二分出相等,那一定是最近的数,要不然就比较最后mid和mid-1的数
#include <string>
#include<iostream>
#include<map>
#include<memory.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<vector>
namespace cc
{
using std::cout;
using std::endl;
using std::cin;
using std::map;
using std::vector;
using std::string;
using std::sort;
using std::priority_queue;
using std::greater;
using std::vector;
using std::swap;
constexpr int N = 1001;
//constexpr int N = 30;
//priority_queue<int,vector<int>, greater<int> >q;
int a[N];
int b[N*N];
void solve()
{
int n;
int t = 0;
while (cin >> n && n)
{
t++;
for (int i = 0;i < n;++i)
cin >> a[i];
int k = 0;
for (int i = 0;i < n - 1;i++)
{
for (int j = i + 1;j < n;j++)
{
b[k++] = a[i] + a[j];
}
}
sort(b, b + k);
int c, q;
cin >> c;
cout << "Case " << t << ":" << endl;
while (c)
{
cin >> q;
int qq = INT32_MAX;
int l = 0, r = k-1;
int mid=0;
int ok = 0;
while (l <= r)
{
mid = (l + r) / 2;
if (b[mid] < q)
l = mid + 1;
else if (b[mid] > q)
r = r - 1;
else
{
ok = 1;
break;
}
}
if(ok)
cout << "Closest sum to " << q << " is " << q<<"." << endl;
else
{
if(mid==0)
cout << "Closest sum to " << q << " is " << b[mid] << "." << endl;
else if(abs(b[mid-1]-q) < abs(b[mid]-q))
cout << "Closest sum to " << q << " is " << b[mid-1] << "." << endl;
else
cout << "Closest sum to " << q << " is " << b[mid] << "." << endl;
}
--c;
}
}
}
};
int main()
{
#ifndef ONLINE_JUDGE
freopen("d://1.text", "r", stdin);
#endif // !ONLINE_JUDGE
cc::solve();
return 0;
}
浙公网安备 33010602011771号