数字游戏-网易2017校招题

题目:
 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和的数字中的最小数(从1开始)。
https://www.nowcoder.com/practice/876e3c5fcfa5469f8376370d5de87c06?tpId=85&tqId=29847&tPage=1&rp=1&ru=/ta/2017test&qru=/ta/2017test/question-ranking

/*
 * 思路:是一种递推的思想,有种像动态规划那种感觉
 *
 * 设数字保存在lib[]数组中,先对lib数组进行从小到大排序。
 * 假lib[0]~lib[m-1]个数字可以构成任意<=X 的数字。
 * 若lib[m] > X+1,则此时,无法构成  X+1  这种大小的情况了。
 * 相反,若lib[m] <= X+1, 则  <= X+lib[m] 的情况都可以构成了,原因如下:
 * 
 * lib[0]~lib[m]之和为 X+lib[m],这是能凑出来的最大值
 * 又因为0~X都可以凑出来,所以  ( X+lib[m]-x  ~  X+lib[m]-1) 即 lib[m] ~ x+lib[m]  都能凑出来。
 * 
 * 现在0 ~ X可以凑出来,lib[m] ~ x+lib[m]  也能凑出来,又因为 lib[m] <= X+1,所以这两段拼起来,就说明:
 *          0~X+lib[m]都能凑出来
 */

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 30;
int lib[N];

int main(){

    int n;
    while (cin>>n){
        for(int i=0;i<n;i++){
            cin>>lib[i];
        }
        sort(lib,lib+n);
        int miss = 0;
        for(int i=0;i<n;i++){
            if(lib[i]>miss+1) break;
            else miss+=lib[i];
        }
        cout<<miss+1<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值