HDU:4104 Discount

来源:互联网 发布:mysql map 编辑:程序博客网 时间:2024/05/16 02:53

题意:问你一组数字中选几个数字相加不能得到最小的数字是多少。

思路:首先将n个数字升序排序,将前i个数字相加得到和为sum,如果第i+1个数大于sum(1--i)+1,那么必不能得到sum(1-i)+1,所以sum(1--i)+1就是答案;如果将所有数字都相加也没有出现刚才的情况,那么答案就是sum(1--n)+1.

 

虽然网上都说这个题很水,我觉得是因为杭电数据太弱了以至于直接输出sum(1--n)+1都能AC。

 尽管如此我也不能保证我说的这个算法的正确性,毕竟算法是从网上找来的,虽然我没有找到反例。

 

#include <cstdio>#include <cstring>#include <iostream>#include <cmath>#include <algorithm>using namespace std;int main(){    int n, a[1005];    while(scanf("%d",&n) != EOF)    {        int sum=0;        for(int i=0; i<n; ++i)            scanf("%d",&a[i]);        sort(a,a+n);        for(int i=0; i<n; ++i)        {            if(a[i]>sum+1)                break;            else sum+=a[i];        }        printf("%d\n",sum+1);    }    return 0;}


 

原创粉丝点击