【2018级互测】志愿填报

Description

  众所周知,今天是高考的第二天,正所谓“月儿弯弯照九州,几家欢喜几家愁”。而高考志愿填报更是抉择的时候,其中每年的高考的志愿填报都是使用的 1、2、4、8 来表示数字,如要填涂 7 则选择 1、2、4 三个数字, Pray2018 作为 1‰的数学爱好者,他决定研究这一问题, 即, 给出 n 个互不相同的正整数, 记为 s[i] , 每个正整数只能使用一次,求这 n 个数 不能组合得到的最小值。

Input

  第一行是一个正整数 n,表示正整数的个数。
  接下来的 n 行每行一个正整数。

Output

  一个正整数,表示这 n 个数 不能组合得到的最小值。

Sample Input

4
1
2
4
8

Sample Output

16

Hint

【数据规模 与约定】
  对于 30%的数据,n<=500,s[i]<=1000;
  对于 70%的数据,n<=1000,s[i]<=10000;
  对于 100%的数据,n<=100000,s[i]<=100000。


思路

  • 找规律,发现:
    设n个数为A1,A2,A3......An
    满足:A2<=A1+1,A3<=A1+A2+1,A4<=A1+A2+A3+1......
    则:所有小于等于An的数都可以被凑出

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,a[100005];
long long ans;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	for(int i=1;i<=n;++i)
	{
		if(a[i]<=ans+1) ans+=a[i];
		else break;
	}
	printf("%d
",ans+1);
	return 0;
}
原文地址:https://www.cnblogs.com/wuwendongxi/p/13372824.html