赌徒

赌徒

时间限制1 Sec  内存限制32 MB
提交30  解决8
[提交][状态][讨论版]

题目描述

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

输入

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

输出

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

样例输入

5

2

3

5

7

12

5

2

16

64

256

1024

0

样例输出

12

no solution

 

题意概括:

查找数列中是否有一个数等于其他三个数之和,如果有输出,若有多个则输出最大的

解题分析:

这道题我是用暴力查找的,但是要稍微优化下时间,不然会超时我是将数列按升序排序,然后从最大的一端开始查找,这样一旦找到一个符合条件的就一定是最大的不管还有没有其他的值,找到后直接输出就可以了。

测试样例:

6

6

3

2

4

2

5

3

0

3

6

4

6

99

0

33

0

测试样例输出:

6

no solution

no solution

代码:

#include<stdio.h>
#include<algorithm>

using namespace std;

int main()
{
    int n, i, j, flag, k;
    int a[1005];
    while(scanf("%d", &n), n != 0){
        flag = 0;
        for(i = 0; i < n; i++)
            scanf("%d", &a[i]);
        sort(a, a+n);
        for(i = n-1; i >= 2; i--){
            for(j = i-1; j >= 1; j--){
                for(k = j-1; k >= 0; k--){
                    if(a[i]-a[j] == a[k]){
                        printf("%d\n", a[i]);
                        flag = 1;
                        break;
                    }
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }
        if(!flag)
            printf("no solution\n");
    }
    return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值