现在的位置: 首页 > 综合 > 正文

HNCU1097:赌徒(二分)

2014年03月26日 ⁄ 综合 ⁄ 共 929字 ⁄ 字号 评论关闭
文章目录

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

 

抱歉!评论已关闭.