BZOJ 1739: [Usaco2005 mar]Space Elevator 太空电梯

题目

 

1739: [Usaco2005 mar]Space Elevator 太空电梯

Time Limit: 5 Sec  Memory Limit: 64 MB

 

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.

牛们要到太空去了!他们打算建造一座太空电梯来送他们进入轨道.
有K(1≤K≤400)神方块,第i种有一个特定的高度hi(l≤hi≤100),一定的存量ci(l≤ci≤10).为防宇宙射线的破坏,第i种方块的任何部分不能超过高度ai(l≤ai≤40000). 请用这些方块堆出最高的太空电梯.

 

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.

 
    第1行输入一个整数K.
    接下来K行,每行输入三个整数hi,ai,ci.

 

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
从底部开始,先放3个方块2,之后3个方块1,接下来6个方块3.不能把3个方块1堆到4个方
块2上,因为这样最高的方块1的顶部高度超过了40.

 

HINT

 

 

 

Source

 

 

题解

Orz考完小四门的期中考试,来刷刷水题愉悦一下身心!Orz坑爹的生物一共75分钟竟然70道选择题一堆大题,我还好几周没去,呵呵~好的,这道题目其实就是做n遍有限背包~

代码

 1 /*Author:WNJXYK*/
 2 #include<cstdio>
 3 #include<algorithm> 
 4 using namespace std;
 5 
 6 struct Node{
 7     int c;
 8     int h;
 9     int a;
10 }; 
11 Node k[405];
12 bool f[40005];
13 bool cmp(Node a,Node b){
14     if (a.a<b.a)return true;
15     return false;
16 }
17 int n;
18 int main(){
19     scanf("%d",&n);
20     for (int i=1;i<=n;i++) scanf("%d%d%d",&k[i].h,&k[i].a,&k[i].c);
21     f[0]=true;
22     sort(k+1,k+n+1,cmp);
23     for (int i=1;i<=n;i++){
24         for (int h=k[i].a;h>=0;h--){
25             for (int j=1;j<=k[i].c&&k[i].h*j+h<=k[i].a;j++){
26                 f[k[i].h*j+h]=f[k[i].h*j+h]||f[h];
27             }
28         }
29     }
30     int Ans=0;
31     for (int i=40000;i>=0;i--)
32         if (f[i]){
33             Ans=i;
34             break;
35         }
36     printf("%d\n",Ans);
37     return 0;
38 }
View Code

 

posted @ 2014-11-14 19:14  WNJXYK  阅读(467)  评论(0编辑  收藏  举报

WNJXYK-我今年一定要努力!