失落【数论】

>Description
出题人心情很失落,于是他直接告诉你让你求出一个集合中所有数所不能凑出来的最小的数是多少。


>Input
第一行一个整数 n。
第二行 n 个整数 ai​。

>Output
一个整数表示答案。


>Sample Input
3
5 1 2

>Sample Output
4

对于 30% 的数据,满⾜ n≤15。
对于 60% 的数据,满⾜ n≤1000。
对于 100% 的数据,满⾜ n≤100000,1≤ai≤10^9。


>解题思路

比赛时暴力打了30分TT

很容易想到给A从小到大排个序,然后做一个前缀和 s u m sum sum
对于第 i i i个数,我们可以知道前 i − 1 i-1 i1个数能组成的最大的数为 s u m [ i − 1 ] sum[i-1] sum[i1],有第 i i i个数能组成的最小的数为 a [ i ] a[i] a[i],我们只要看看这两数之间有没有缝隙就行了。

可能会想到第i个数与前i-1个数排列会不会也会有缝隙,但是认真想一下,如果是这样的话 i − 1 i-1 i1之前的缝隙就会被找到,我们根本不会到达i


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N 100005
using namespace std;

ll n, a[N], sum[N];

int main()
{
	scanf ("%lld", &n);
	for (ll i = 1; i <= n; i++) scanf ("%lld", &a[i]);
	sort (a + 1, a + 1 + n);
	for (ll i = 1; i <= n; i++)
	  sum[i] = sum[i - 1] + a[i];
	for (ll i = 1; i <= n; i++)
	  if (sum[i - 1] + 1 < a[i])
	  {
		printf ("%lld", sum[i - 1] + 1); //缝隙中最小的数
		exit (0); 
	  }
	printf ("%lld", sum[n] + 1);
	return 0;
}

你可能感兴趣的:(数论)