赌徒

1097:赌徒 分数:2

时间限制:1 秒
内存限制:32 兆
特殊判题:


标签

  • 查找
  • 二分查找

题目描述

有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

【分析】

(分析过程附加在程序中)

用java语言编写程序,代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		while(input.hasNext()) {
			int n = input.nextInt();
			if(n == 0)
				break;
			
			int[] duzhu = new int[n];
			for(int i = 0; i < n; i++)
				duzhu[i] = input.nextInt();
			
			if(n <= 3) {
				System.out.println("no solution");
				continue;
			}
			
			Arrays.sort(duzhu);
			
			boolean findResult = false;//标志是否找到结果
			int result = 0;//最终胜利者的赌注
			//先假定数组duzhu中下标为i的值为胜利者的赌注,再确定两个“赌注”,
			//通过在数组中寻找第三个使得下标为1的值成为胜利者的赌注的数。
			//查找方法通过二分查找
			for(int i = n - 1; i >= 0; i--) {
				for(int j = 0; j < i; j++) {
					for(int k = j + 1; k < i; k++) {
						int temp = duzhu[i] - duzhu[j] - duzhu[k];
						//寻找数组中使得下标i的值成为胜利者赌注的第三个赌注的下标
						int r = binarySearch(k + 1, i - 1, duzhu, temp);
						//找到成立条件,标志结果,跳出循环
						if(r != -1) {
							findResult = true;
							result = duzhu[i];
							break;
						}
					}
					if(findResult)
						break;
				}
				if(findResult)
					break;
			}
			if(findResult)
				System.out.println(result);
			else
				System.out.println("no solution");
		}
	}
	//在数组src中从下标low到high进行二分查找,查找target
	//若在数组src中找到target,则返回target在数组中的下标,否则返回-1
	public static int binarySearch(int low, int high, int[] src, int target) {
		// TODO Auto-generated method stub
		while(low <= high) {
			int mid = (low + high) / 2;
			if(src[mid] == target)
				return mid;
			if(src[mid] < target)
				low = mid + 1;
			else
				high = mid - 1;
		}
		return -1;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值