nowcoder300J Mex

题目链接

题意

给出一个长度为\(n(n \le 10^5)\)序列,求其每个子序列之和所组成的集合的\(mex\)

思路

这么水的题都没想出来,感觉自己脑子瓦特了。
假设前\(i\)位可以组成区间\([0,x]\)内的所有数。那么加入第\(i+1\)位后,就会让\([0+a[i+1],x + a[i + 1]]\)这个区间中的所有数字都可以组成。只要判断这个区间和原区间并起来是不是连续的就行了。

代码

/*
* @Author: wxyww
* @Date:   2019-04-21 11:49:09
* @Last Modified time: 2019-04-21 14:14:56
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 100000 + 100;
ll read() {
    ll x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9') {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
int a[N];
int main() {
    int n = read();
    for(int i = 1;i <= n;++i) a[i] = read();
    sort(a + 1,a + n + 1);
    ll now = 0;
    for(int i = 1;i <= n;++i) {
        if(now < a[i] - 1) {
            printf("%d\n",now + 1);
            return 0;
        }
        now += a[i];
    }
    cout<<now + 1;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wxyww/p/nowcoder700J.html
Mex