zoukankan      html  css  js  c++  java
  • hdu 5188 zhx and contest [ 排序 + 背包 ]

    传送门

    zhx and contest

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 145    Accepted Submission(s): 49


    Problem Description
    As one of the most powerful brushes in the world, zhx usually takes part in all kinds of contests.
    One day, zhx takes part in an contest. He found the contest very easy for him.
    There are n problems in the contest. He knows that he can solve the ith problem in ti units of time and he can get vi points.
    As he is too powerful, the administrator is watching him. If he finishes the ith problem before time li , he will be considered to cheat.
    zhx doesn't really want to solve all these boring problems. He only wants to get no less than w points. You are supposed to tell him the minimal time he needs to spend while not being considered to cheat, or he is not able to get enough points.
    Note that zhx can solve only one problem at the same time. And if he starts, he would keep working on it until it is solved. And then he submits his code in no time.
     
    Input
    Multiply test cases(less than 50 ). Seek EOF as the end of the file.
    For each test, there are two integers n and w separated by a space. (1n30 , 0w109 )
    Then come n lines which contain three integers ti,vi,li . (1ti,li105,1vi109 )
     
    Output
    For each test case, output a single line indicating the answer. If zhx is able to get enough points, output the minimal time it takes. Otherwise, output a single line saying "zhx is naive!" (Do not output quotation marks).
     
    Sample Input
    1 3 1 4 7 3 6 4 1 8 6 8 10 1 5 2 2 7 10 4 1 10 2 3
     
    Sample Output
    7 8 zhx is naive!
     
    Source
     
    Recommend
    hujie   |   We have carefully selected several similar problems for you:  5189 5184 5181 5180 5177 

    照例,先转一发官方题解:http://bestcoder.hdu.edu.cn/

    1003 zhx and contest
    状态压缩动态规划。
    
    表示当前已经做了的题的集合。i  
    
    表示做完集合i中的所有题的最短用时。那么转移是相当简单的。但是也要注意判断状态是否合法时总分数可能会超过int范围。
    另外有一种按
    
    排序后折半枚举的思路。但是这种思路是错的。因为很有可能做一道结束时间靠前的题会导致时间被卡,但是它又可以放到后面再做。就像背包不能贪心一样。


    如官方发题解所说,不能按照l排序,这种贪心是错误的。
    但是,可以按照 l-t 排序,即如果要选该题,那么浪费少的先选(如果不选,后面也不会选了),下面就是01背包了。

    还是看不懂,为何n<=30也可以状压,不是应该妥妥 TLE+MLE的节奏吗? 难道是数据弱了? 等待大神博客ing
    13130322 2015-03-15 10:11:17 Accepted 5188 202MS 14184K 1739 B G++ czy
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <stack>
     4 #include <vector>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <map>
     8 #include <string>
     9 
    10 #define ll long long
    11 int const N = 32;
    12 int const M = 100002;
    13 int const inf = 1000000000;
    14 ll const mod = 1000000007;
    15 
    16 using namespace std;
    17 
    18 int n,w;
    19 int dp[N*M];
    20 int sum;
    21 int sumt,mal;
    22 int ma;
    23 
    24 typedef struct
    25 {
    26     int t;
    27     int v;
    28     int l;
    29 }PP;
    30 
    31 PP p[N];
    32 
    33 bool cmp(PP a,PP b)
    34 {
    35     return a.l-a.t<b.l-b.t;
    36 }
    37 void ini()
    38 {
    39     int i;
    40     sum=0;sumt=0;mal=0;
    41     for(i=1;i<=n;i++){
    42         scanf("%d%d%d",&p[i].t,&p[i].v,&p[i].l);
    43         sum+=p[i].v;
    44         sumt+=p[i].t;
    45         mal=max(mal,p[i].l);
    46     }
    47     ma=mal+sumt;
    48     sort(p+1,p+1+n,cmp);
    49    // for(i=1;i<=n;i++) printf(" i=%d t=%d v=%d l=%d
    ",i,p[i].t,p[i].v,p[i].l);
    50 }
    51 
    52 void solve()
    53 {
    54     if(sum<w) return;
    55     memset(dp,0,sizeof(dp));
    56     int i,j;
    57     for(i=1;i<=n;i++){
    58         //printf("    i=%d l=%d
    ",i,p[i].l);
    59         for(j=ma;j>=0;j--){
    60             if(j>=p[i].l){
    61                 if(j>=p[i].t)
    62                     dp[j]=max(dp[j],p[i].v+dp[ j-p[i].t ]);
    63             }
    64             else{
    65                 //dp[j]=dp[i-1][j];
    66             }
    67             //printf(" i=%d j=%d dp=%d
    ",i,j,dp[j]);
    68         }
    69     }
    70 }
    71 
    72 void out()
    73 {
    74     if(sum<w){
    75         printf("zhx is naive!
    ");
    76     }
    77     else{
    78         int i;
    79         for(i=0;;i++){
    80             if(dp[i]>=w){
    81                 printf("%d
    ",i);break;
    82             }
    83         }
    84     }
    85 }
    86 
    87 int main()
    88 {
    89     //freopen("data.in","r",stdin);
    90     //scanf("%d",&T);
    91     //for(cnt=1;cnt<=T;cnt++)
    92     while(scanf("%d%d",&n,&w)!=EOF)
    93     {
    94         ini();
    95         solve();
    96         out();
    97     }
    98 }
  • 相关阅读:
    tomact与eclipces的配置
    IDEA中Flink环境pom.xml文件配置
    python读写mysql
    用pyspark实现Wordcount
    python计算相似度
    Spark读取mysql
    Spark之WordCount
    IDEA中Spark环境pom.xml文件配置
    Spark之HelloWorld
    (转)二叉树的中序遍历与后序遍历构造二叉树思路(递归方法,含图片说明)
  • 原文地址:https://www.cnblogs.com/njczy2010/p/4338863.html
Copyright © 2011-2022 走看看