1 条题解

  • 1
    @ 2017-10-05 14:45:14

    先从小到大排序,如果取前i-1个数能够到达1到sum,那么加上第i个数后一定可以取得a[i]+1,a[i]+2……a[i]+sum。但是当a[i]>sum+1的时候,从sum+1到a[i]都一定取不到,这时候就退出啦。所以只有a[i]<=sum+1,将sum更新就可以保证从1到sum+a[i]都可以取到了。
    作个说明(看代码)
    #include<bits/stdc++.h>
    const long long maxn=100001;
    inline const void read(long long &a)
    {
    a=0;
    char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')
    {
    a=(a<<1)+(a<<3)+c-'0';
    c=getchar();
    }
    }
    inline const void write(long long a)
    {
    if(a>9)write(a/10);
    putchar(a%10+'0');
    }
    long long n,a[maxn],sum=0;
    int main()
    {
    read(n);
    for(long long i=1;i<=n;i++)read(a[i]);
    std::sort(a+1,a+1+n);
    for(long long i=1;i<=n;i++)
    {
    if(a[i]<=sum+1)sum+=a[i];//sum表示能够已经能够组成1到sum。
    else break;
    //如果下一个数能在1到sum+1内,一定可以用这些数凑成1到sum+a[i];否则退出。
    }
    write(sum+1);
    return 0;
    }

  • 1

信息

难度
9
分类
(无)
标签
(无)
递交数
1
已通过
1
通过率
100%
上传者