zoukankan      html  css  js  c++  java
  • HDU 4104 Discount(n个数不能构成的最小值)

    http://acm.hdu.edu.cn/showproblem.php?pid=4104

    题意:
    给出n个数,每个数最多只能用一次,每次可以选任意个数相加,求不能相加得到的最小值是多少。

    思路:

    先排序并计算出前缀和。

    现在如果前k个数能组成[1,$sum_{k}$]之间的所有数,那么再新加入$a_{k+1}$后,就可以组成[$a_{k+1}$,$a_{k+1}+sum_{k}$]之间的所有数,那么这两个区间不能有间隔。所以必须满足$a_{k+1}$<=$sum_{k}$+1。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int a[1005], sum[1005];
     7 
     8 int main()
     9 {
    10     int n;
    11     sum[0] = 0;
    12     while(~scanf("%d",&n))
    13     {
    14         for(int i=1; i<=n; i++)
    15         {
    16             scanf("%d",&a[i]);
    17             sum[i] = sum[i-1]+a[i];
    18         }
    19         sort(a+1,a+n+1);
    20         int i;
    21         for(i=1; i<=n; i++)
    22         {
    23             if(a[i]>sum[i-1]+1)  break;
    24         }
    25         printf("%d
    ",sum[i-1]+1);
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    线程同步技术
    线程调用
    进程与线程
    网络配置
    vi
    文件系统
    系统管理命令
    Linux常用命令
    Shell编程
    新版chrome touch警告处理办法
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7883660.html
Copyright © 2011-2022 走看看