2017.10.5 国庆清北 D5T1 拼不出的数

题目描述

3 个元素的集合{5,1,2}的所有子集的和分别是0,1,2,3,5,6,7,8。发现最小的不能由该集合子集拼出的数字是4。

现在给你一个n个元素的集合,问你最小的不能由该集合子集拼出的数字是多少。

输入输出格式

输入格式:

第一行两个整数n。

第n 个正整数ai,表示集合内的元素。

输出格式:

一行一个整数答案。

 

输入输出样例

输入样例#1:
3
5 1 2
输出样例#1:
4

说明

对于30% 的数据,满足n <=5。

对于60% 的数据,满足n <= 1000。

对于100% 的数据,满足n <= 100000,1 <= ai <=10^9。

保证ai互不相同。

 

 1 /*
 2 1、将每个读入的数从小到大排序。
 3 2、sum表示当前的能合成的连续的最大数 
 4 如果num[i]>sum+1,也就是合不出sum+1,则不连续了,输出sum+1 
 5 否则sum+=num[i]。
 6 为什么这样做呢
 7 因为若num[i]<=sum, 
 8 即1~num[i]可以被合成,
 9 那么sum+1~sum+num[i]间的数一定可以被合成
10 下一个可能不能被合成的数就是sum+num[i]+1了 
11 */
12 
13 #include<iostream>
14 #include<cstdio>
15 #include<cmath>
16 #include<cstring>
17 #include<algorithm>
18 #include<map>
19 #define N 100005
20 using namespace std;
21 
22 int n,num[N];
23 long long sum; 
24 
25 inline void read(int &num)
26 {
27     char c=getchar();
28     for(;!isdigit(c);c=getchar());
29     for(;isdigit(c);c=getchar()){num=num*10+c-'0';};
30 }
31 
32 void init()
33 {
34     scanf("%d",&n);
35     for(int i=1;i<=n;i++) scanf("%d",&num[i]);
36     sort(num+1,num+n+1);
37     for(int i=1;i<=n;i++)
38     {
39         if(num[i]>sum+1) break;
40         sum+=num[i];
41     }
42     printf("%lld",sum+1);
43 }
44 
45 int main()
46 {
47     //freopen("lost.in","r",stdin);
48     //freopen("lost.out","w",stdout);
49     init();
50     fclose(stdin);
51     fclose(stdout);
52     return 0;
53 }
View Code

转载于:https://www.cnblogs.com/lovewhy/p/7649426.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值