HNCU1097:赌徒(二分)

来源:互联网 发布:刷金币软件 编辑:程序博客网 时间:2024/04/30 20:55

http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1097

题目描述

有n个赌徒打算赌一局。规则是:
每人下一个赌注,赌注为非负整数,且任意两个赌注都不相同。胜者为赌注恰好是其余任意三个人的赌注之和的那个人。如果有多个胜者,我们取赌注最大的那个为最终胜者。
例如,A,B,C,D,E分别下赌注为2、3、5、7、12,最终胜者是E,因为12=2+3+7。

输入格式

输入包含多组测试数据。每组首先输入一个整数n(1<=n<=1000),表示赌徒的个数。
接下来n行每行输入一个非负整数b(0<=b<32768),表示每个赌徒下的赌注。
当n=0时,输入结束。

输出

对于每组输入,输出最终胜者的赌注,如果没有胜者,则输出no solution。

样例输入

5




12
5

16 
64 
256 
1024
0

样例输出

12
no solution

 

简单二分

 

#include <stdio.h>#include <algorithm>using namespace std;int bin(int *a,int l,int h,int k){    int m;    while(l<h)    {        m = (l+h)/2;        if(k == a[m])            return m;        else if(k<a[m])            h = m;        else            l = m+1;    }    return -1;}int main(){    int n,i,j,k,tem,s,a[1005],flag,ans;    while(~scanf("%d",&n),n)    {        flag = 0;        for(i = 0; i<n; i++)            scanf("%d",&a[i]);        sort(a,a+n);        for(i = n-1; i>=0; i--)        {            for(j = 0; j<i; j++)            {                for(k = j+1; k<n; k++)                {                    tem = a[i]-a[k]-a[j];                    s = bin(a,k+1,n,tem);                    if(s!=-1 && s!=i)                    {                        ans = i;                        flag = 1;                        break;                    }                }                if(flag)                    break;            }            if(flag)                break;        }        if(flag)            printf("%d\n",a[ans]);        else            printf("no solution\n");    }    return 0;}


 

原创粉丝点击