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;
}
View Code
原文地址:https://www.cnblogs.com/zsyacm666666/p/4924200.html