数字游戏问题(迭代java)

1、牛客网原题:

题目描述

小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数。

输入描述:

输入第一行为数字个数n (n ≤ 20)
第二行为n个数xi (1 ≤ xi ≤ 100000)

输出描述:

输出最小不能由n个数选取求和组成的数
示例1

输入

3
5 1 2

输出

4

2、题目分析:

2.1、自己一直有个误解,就是手续找出给出的数字序列中,能表示的最小值min,然后在找出:在这个数字后面的不能被数字序列通过组合的第一个最小的数字。但是题目的意思是:最小值min应该从1开始,然后依次递增,也就是查找正数范围内,最小的不能被表达的整数。

2.2、看了大家的评论,原来这个题目来源于code jam,这个google竞赛的一个网站,

给出原题网址:http://code.google.com/codejam/contest/4244486/dashboard#s=p2

原题解法:http://code.google.com/codejam/contest/4244486/dashboard#s=a&a=2


3、code实现:已a

package schooloffer17;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

/**
 * Created by caoxiaohong on 17/11/6 11:33.
 * <数字游戏></数字游戏>
 * 小易邀请你玩一个数字游戏...
 */
public class NumberGame {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n;//输入数字个数
        while (scanner.hasNext()){
            n=scanner.nextInt();
            scanner.nextLine();//换行
            ArrayList<Integer> numbers=new ArrayList<Integer>();
            for(int i=0;i<n;i++)
                numbers.add(scanner.nextInt()); // 1 ≤ xi ≤ 100000
            Collections.sort(numbers);
            //如果最小的数字都比1大,那么就不用进行下面的计算了,直接返回1即可.因为1就是最小的不能被表达的数字.
            if(numbers.get(0)>1) {
                System.out.println(1);
                continue;
            }
            /**
             * 迭代过程:
             * 1.min表示:numbers下标从0到i的数字进行组合,能表示的数字范围:[1,min];
             * 2.新增加了数字numbers.get(i)后,要想
             *   [1,min]U[tmp]U[1+tmp,min+tmp]=[1,min+tmp],则要求:tmp<=min+1即可
             * 3.例子:
             *
             */
            int min=1; //min初始化为第一个元素的值
            int tmp;
            for(int i=1;i<n;i++){
                tmp=numbers.get(i);
                if(tmp>min+1)
                    break;
                else{
                    min += tmp;
                }
            }
            System.out.println(min+1);
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值