J Mex
输入
3
1 2 5输出
4
说明:
S’=(), ∑S’=0
S’=(1), ∑S’=1
S’=(2), ∑S’=2
S’=(1,2), ∑S’=3
S’=(5), ∑S’=5
There is no way for ∑S’=4, hence 4 is the answer.
题目
呜呜呜,签到题都不会,菜枯辽。第一次爆零,补个签到题留念。
这个算思维题?贪心?我不懂
题意:求一个序列的所有子序列和中,没有出现的最小数。
因为序列长度为1e5,所以复杂度不能超过 O(nlogn) 。
找规律。
首先,思考有没有一个无敌的序列,使 ans = 序列总和+1
序列 | ans |
---|---|
1 | 2 |
1 2 | 4 |
1 2 4 | 8 |
1 2 4 8 | 16 |
1 2 4 8 16 | 31 |
… | … |
1.以第3个序列为例,此序列满足存在 任意小于8 的子序列和。
2.此时在第4个序列 把 8 加入序列中,由 1 知可以找到序列和=8+1、8+2、8+3、……、8+7,所以第4个序列满足存在 任意小于16 的子序列和。
……(然后可以找到规律了
if(a[i]>sum+1) ans=sum+1;
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int Max_num=1e5+17;
ll a[Max_num];
int main(){
int n; scanf("%d",&n);
for(int i=0;i<n;++i) scanf("%lld",&a[i]);
sort(a,a+n);
if(a[0]!=1) {printf("1\n"); return 0;}
ll sum=a[0];
for(int i=1;i<n;++i){
if(a[i]>sum+1) break;
sum+=a[i];
}
printf("%lld\n",sum+1);
return 0;
}