Poj 2392 Space Elevator

来源:互联网 发布:程序员转行产品经理 编辑:程序博客网 时间:2024/06/15 10:05

Space Elevator
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 12308 Accepted: 5854

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

37 40 35 23 82 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.

Source

题意: 一群牛想要上太空,有一些砖块,用来搭建上太空的路,因为宇宙射线线的存在,每块砖都有其最高限度,不能超过其最高限度。

           给你这些砖块的高度, 最大限度,数量。

思路:Dp + 贪心,  先按照最大限度排序(升序),然后枚举每一类砖块,在已存在高度继续往上垒的情况,不断记录下下来。

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;typedef struct block{int h, a, c;// 高度 ,限度,数量 }B;B a[410];bool dp[40100];// dp[i] == true 高度 i 存在 bool cmp(B m,B n){return m.a < n.a;}int main(){int k;scanf("%d", &k);int max = 0;for(int i=1; i<=k; i++){scanf("%d %d %d",&a[i].h, &a[i].a, &a[i].c);}sort(a+1, a+k+1, cmp); // 按照限度排序 memset(dp, 0, sizeof(dp));dp[0] = 1;for(int i=1; i<=k; i++){     for(int j=a[i].a; j>=0; j--)  // 从每一类砖的限度往下枚举 ,如果从0往上需要 01 数组      {       if(dp[j])        {                  for(int l=1; l<=a[i].c; l++)                  {                     int tem = j + a[i].h * l;                     if(tem <= a[i].a)                     {                          dp[tem] = 1;   }  }             } }    }        int ans = 0;    for(int i=0; i<=a[k].a; i++)    {    if(dp[i])  ans = i;}    printf("%d\n", ans);return 0;}


原创粉丝点击