标签:
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; const int maxn=1e3+10; int a[maxn]; bool cmp(int x1,int x2) { return x1>x2; } int main() { int n; while(cin>>n,n!=0) { for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n,cmp); int ans=-1e9; int flag=0; for(int i=0;i<n;i++) { for(int j=0;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; break; } } if(flag) break; } if(flag) break; } if(flag) break; } if(flag) printf("%d\n",ans); else printf("no solution\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/zsyacm666666/p/4924200.html