poj 2549 Sumsets
poj 2549
给出一个集合S,其中包含n个数字,请你选择四个数字a,b,c,d满足d=a+b+c,d要尽可能地大。
请注意选择的数字不能是同一个元素,(大小可以相同)
可以先固定d,把数字从大到小排一遍,然后先选d,在从1到n个元素中选一个a,(请注意a可以大于d,因为有可能d-a<0而且c+b<0),假如你选择了
a[i]-a[j]作为d-a,之后的元素可以在j+1之后查找,为什么?因为a,b,c,d其中的a,b,c肯定会有一个先后顺序,而且d减去其中的任何一个,都能顺利地找到另外两个,因此我们可以把a从从往后找,那么另外的两个元素肯定就在j后面了。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[1111]; bool cmp(int x1,int x2) { return x1>x2; } int main() { int n; while(cin>>n&&n) { for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1,cmp); int ans,flag=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) continue; int temp=a[i]-a[j]; for(int k=j+1;k<=n;k++) { for(int h=k+1;h<=n;h++) { if(a[k]+a[h]==temp) { ans=a[i]; flag=1; goto stop; } } } } } stop:; if(flag) cout<<ans<<endl; else cout<<"no solution"<<endl; } return 0; }