【2020.8.23NOIP模拟赛】失落
【 2020.8.23 N O I P 模 拟 赛 】 失 落 【2020.8.23NOIP模拟赛】失落 【2020.8.23NOIP模拟赛】失落
题目描述
出题人心情很失落,于是他直接告诉你让你求出一个集合中所有数所不能凑出来的最小的数是多少。
输入
第一行一个整数 n n n。
第二行 nn 个整数 a i a_i ai。
输出
一个整数表示答案。
样例输入
3
5 1 2
样例输出
4
题目解析
这道题是一道数学题,以
a
n
s
ans
ans来表示在这个集合里最小的不能凑出来的整数。
因为
a
i
a_i
ai的最小值为
1
1
1,所以
a
n
s
ans
ans的初始值为
1
1
1。
然后这里有个规律(默认
a
i
a_i
ai是不会重复的):
如果集合里没有
1
1
1,那么这个集合凑不出的最小数就是
1
1
1。
而如果有
1
1
1,而且没有
2
2
2,答案就是
2
2
2。
以上不是显而易见
我们把
a
i
a_i
ai升序排序先,然后从
1
1
1循环到
n
n
n,如果
a
i
≤
a
n
s
a_i≤ans
ai≤ans(即
a
i
a_i
ai是属于可以凑出来),那么就把
a
n
s
+
=
a
i
ans += a_i
ans+=ai(把可以凑出来的范围加大)
code
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll n, ans=1;
ll a[100005];
int main ()
{
scanf ("%lld", &n);
for (register ll i = 1; i <= n; ++ i) scanf ("%lld", &a[i]);
sort (a + 1, a + 1 + n);
for (register ll i = 1; i <= n; ++ i)
{
if (a[i] <= ans) ans += a[i];
}
printf("%lld",ans);
return 0;
}