1. 程式人生 > 實用技巧 >【2018級互測】志願填報

【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\n",ans+1);
	return 0;
}