poj 2392 Space Elevator

Space Elevator

Description

The cows are going to space! They plan to achieve orbit by building a sort of space elevator: a giant tower of blocks. They have K (1 <= K <= 400) different types of blocks with which to build the tower. Each block of type i has height h_i (1 <= h_i <= 100) and is available in quantity c_i (1 <= c_i <= 10). Due to possible damage caused by cosmic rays, no part of a block of type i can exceed a maximum altitude a_i (1 <= a_i <= 40000). 

Help the cows build the tallest space elevator possible by stacking blocks on top of each other according to the rules.

Input

* Line 1: A single integer, K 

* Lines 2..K+1: Each line contains three space-separated integers: h_i, a_i, and c_i. Line i+1 describes block type i.

Output

* Line 1: A single integer H, the maximum height of a tower that can be built

Sample Input

3
7 40 3
5 23 8
2 52 6

Sample Output

48

Hint

OUTPUT DETAILS: 

From the bottom: 3 blocks of type 2, below 3 of type 1, below 6 of type 3. Stacking 4 blocks of type 2 and 3 of type 1 is not legal, since the top of the last type 1 block would exceed height 40.
 
这题首先要对每种石头能放的最大大高度进行排序,然后在进行取石头,用数组f[j]标记能到达的高度为j,同时还要use[i]数组记录到达高度j时每种石头用的个数。
代码如下
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 struct ss
 6 {
 7     int h,a,c;
 8     /*bool operator<(const ss &g)const{
 9         return a<g.a;*/     //不用cmp进行排序而用注释那部分代码,效率更高
10 }num[410];
11 bool cmp(ss t1,ss t2)
12 {
13     return t1.a<t2.a;
14 }
15 int f[50000],use[50000];
16 int main()
17 {
18     int n,i,j;
19     while(scanf("%d",&n)!=EOF)
20     {
21         int sum=0;
22         for(i=1;i<=n;i++)
23         {
24             scanf("%d%d%d",&num[i].h,&num[i].a,&num[i].c);
25             sum=sum+num[i].c;
26         }
27         sort(num+1,num+n+1,cmp);
28         memset(f,0,sizeof(f));
29         f[0]=1;
30         int max=0;
31         for(i=1;i<=n;i++)
32         {
33             memset(use,0,sizeof(use));
34             for(j=num[i].h;j<=num[i].a;j++)
35             {
36                 if(!f[j]&&f[j-num[i].h]&&use[j-num[i].h]+1<=num[i].c)//如果f[j-num[i].h]!=0表示j-num[i].h这高度达到啦的
37                 {
38                     f[j]=1;
39                     use[j]=use[j-num[i].h]+1;
40                     if(max<j) max=j; //记录达到的最大高度
41                 }
42             }
43         }
44         printf("%d\n",max);
45     }
46     return 0;
47 }

 

posted @ 2013-08-19 20:17  ゐ星落★孤晨ね  阅读(171)  评论(0编辑  收藏  举报