码迷,mamicode.com
首页 > 编程语言 > 详细

hdu 5188 zhx and contest [ 排序 + 背包 ]

时间:2015-03-15 10:49:19      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:

传送门

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 i技术分享th技术分享技术分享 problem in t技术分享i技术分享技术分享 units of time and he can get v技术分享i技术分享技术分享 points.
As he is too powerful, the administrator is watching him. If he finishes the i技术分享th技术分享技术分享 problem before time l技术分享i技术分享技术分享 , 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技术分享 , 0w10技术分享9技术分享技术分享 )
Then come n lines which contain three integers t技术分享i技术分享,v技术分享i技术分享,l技术分享i技术分享技术分享 . (1t技术分享i技术分享,l技术分享i技术分享10技术分享5技术分享,1v技术分享i技术分享10技术分享9技术分享技术分享 )
 

 

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\n",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\n",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\n",i,j,dp[j]);
68         }
69     }
70 }
71 
72 void out()
73 {
74     if(sum<w){
75         printf("zhx is naive!\n");
76     }
77     else{
78         int i;
79         for(i=0;;i++){
80             if(dp[i]>=w){
81                 printf("%d\n",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 }

 

hdu 5188 zhx and contest [ 排序 + 背包 ]

标签:

原文地址:http://www.cnblogs.com/njczy2010/p/4338863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!