C语言编程练习36:赌徒

题目描述

有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。

样例输入 Copy

5
2 
3 
5 
7 
12
5
2 
16 
64 
256 
1024
0

样例输出 Copy

12
no solution

机构平台标程
#include<cstdio>
#include<algorithm>
using namespace std;
 
int bs(int a[],int l,int r,int x)
{
    int m;
    while(l<r)
    {
        m=(l+r)>>1;
        if(a[m]==x)
            return m;
        if(a[m]<x)
            l=m+1;
        else
            r=m;
    }
    return -1;
}
 
int main()
{
    int n,a[1000],i,j,k,bet,p,flag,ans;
    while(scanf("%d",&n)!=EOF,n)
    {
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        for(flag=0,i=n-1;i>=0;i--)
        {
            for(j=0;j<i;j++)
            {
                for(k=j+1;k<n;k++)
                {
                    bet=a[i]-a[j]-a[k];
                    p=bs(a,k+1,n,bet);
                    if(p!=-1&&p!=i)
                    {
                        ans=i;
                        flag=1;
                        break;
                    }
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }
        if(flag)
            printf("%d\n",a[ans]);
        else
            puts("no solution");
    }
    return 0;
}

 



posted @ 2021-01-27 16:40  FantasticDoulbeFish  阅读(375)  评论(0编辑  收藏  举报