题意:一些数,选4个(可重复),输出最接近给定数字的和。
思路:经典题目,使用中途相遇法可做。先枚举两个数字,求和存入并排序。再枚举两个数字,根据缺少部分,二分之前的和,取最大值。
STL是神器,要学会使用。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
const int maxn=1005;
int a[maxn];
vector<LL> v;
int main()
{
int n,kase=0;
LL sum;
while(cin>>n>>sum)
{
if(!n&&!sum) break;
for(int i=0; i<n; ++i)
cin>>a[i];
v.clear();
for(int i=0; i<n; ++i)
for(int j=i; j<n; ++j)
v.push_back(a[i]+a[j]);
sort(v.begin(),v.end());
LL ans=0;
for(int i=0; i<n; ++i)
for(int j=i; j<n; ++j)
{
LL res=sum-a[i]-a[j];
int it=upper_bound(v.begin(),v.end(),res)-v.begin();
if(it!=0||(it==v.size()&&v[it-1]<=res))
ans=max(ans,a[i]+a[j]+v[it-1]);
}
cout<<"Case "<<++kase<<": "<<ans<<endl<<endl;
}
return 0;
}