数字游戏问题(迭代java)

来源:互联网 发布:淘宝上传图片模糊 编辑:程序博客网 时间:2024/06/02 00:15

1、牛客网原题:

题目描述

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

输入描述:

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

输出描述:

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

输入

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



原创粉丝点击