KaTeX parse error: Undefined control sequence: \opertorname at position 1: \̲o̲p̲e̲r̲t̲o̲r̲n̲a̲m̲e̲{失落}
题目链接: luogu T145185 \operatorname{luogu\ T145185} luogu T145185 \ SSL比赛 1513 \operatorname{SSL比赛\ 1513} SSL比赛 1513
题目
出题人心情很失落,于是他直接告诉你让你求出一个集合中所有数所不能凑出来的最小的数是多少。
输入
第一行一个整数 n n n 。
第二行 n n n 个整数 a i a_i ai 。
输出
一个整数表示答案。
样例输入
3
5 1 2
样例输出
4
数据范围
对于
30
%
30\%
30% 的数据,满⾜
n
≤
15
n ≤ 15
n≤15 。
对于
60
%
60\%
60% 的数据,满⾜
n
≤
1000
n ≤ 1000
n≤1000 。
对于
100
%
100\%
100% 的数据,满⾜
n
≤
100000
,
1
≤
a
i
≤
1
0
9
n ≤ 100000, 1 ≤ ai ≤ 10^9
n≤100000,1≤ai≤109
思路
这道题是一道数学暴力枚举题。
我们可以发现,如果
0
∼
i
0\sim i
0∼i 的数都可以组出来,那我们把一个数
j
j
j 也加进去,那就可以有
0
+
j
,
1
+
j
,
2
+
j
,
.
.
.
.
.
.
,
i
+
j
0 + j,1+j,2+j,......,i+j
0+j,1+j,2+j,......,i+j 。
那如果
j
>
i
+
1
j>i+1
j>i+1 ,那
i
+
1
i+1
i+1 就组不出来。(因为
0
+
j
0+j
0+j 已经大于
i
+
1
i+1
i+1 了)
那我们就可以通过这两个东西,把集合中的数都排个序,然后从小到大进行操作,可以用前缀和记录当前从
0
0
0 到多少一直都没有组不出来的数。
如果到最后枚举完都没有组不出来的数,那就是所有数的总和
+
1
+1
+1 。
代码
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n, a[100001];
ll now, sum[100001];
int read() {//快读
int an = 0, zhengfu = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') zhengfu = -zhengfu;
c = getchar();
}
while (c >= '0' && c <= '9') {
an = an * 10 + c - '0';
c = getchar();
}
return an * zhengfu;
}
int main() {
// freopen("text.txt", "r", stdin);
n = read();//读入
for (int i = 1; i <= n; i++)
a[i] = read();
sort(a + 1, a + n + 1);//排序
for (int i = 1; i <= n; i++) {
sum[i] = sum[i - 1] + a[i];//求出前缀和
if (now + 1ll < (ll)a[i]) {//不能排满
printf("%lld", now + 1ll);
return 0;
}
now += a[i];//能排满
}
printf("%lld", sum[n] + 1ll);//所有数都用完了
return 0;
}