SDUT:2157 Greatest Number(中途相遇法)

来源:互联网 发布:药品价格查询软件 编辑:程序博客网 时间:2024/04/29 22:26

题意:一些数,选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;}


0 0