码迷,mamicode.com
首页 > 其他好文 > 详细

A - Sumsets

时间:2015-10-30 20:36:56      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

 

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;
}
View Code

 

A - Sumsets

标签:

原文地址:http://www.cnblogs.com/zsyacm666666/p/4924200.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!