SDUT:2157 Greatest Number(中途相遇法)
阿新 • • 發佈:2019-01-31
題意:一些數,選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; }