Space Elevator
Time Limit: 1000MS | Memory Limit: 65536K | |
Total 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
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.
Source
题意: 一群牛想要上太空,有一些砖块,用来搭建上太空的路,因为宇宙射线线的存在,每块砖都有其最高限度,不能超过其最高限度。
给你这些砖块的高度, 最大限度,数量。
思路:Dp + 贪心, 先按照最大限度排序(升序),然后枚举每一类砖块,在已存在高度继续往上垒的情况,不断记录下下来。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef struct block {
// 分别代表 高度、限度、数量
int h, a, c;
}Block;
const int N = 410;
Block b[N];
// 如果 (dp[i] == true),代表这些砖块可以堆到这个高度
bool dp[N*100];
bool cmp(Block aTemp, Block bTemp) {
return aTemp.a < bTemp.a;
}
int main() {
int k;
cin >> k;
for(int i=1; i<=k; i++) {
cin >> b[i].h >> b[i].a >> b[i].c;
}
// 按照砖块的限度,给砖块排序
sort(b+1, b+k+1, cmp);
memset(dp, 0, sizeof(dp));
dp[0] = true;
for(int i=1; i<=k; i++) {
// 从每一类砖的限度往下枚举
for(int j=b[i].a; j>=0; j--) {
if(true == dp[j]) {
for(int t=1; t<=b[i].c; t++) {
int temp = j + b[i].h*t;
if(temp <= b[i].a) {
dp[temp] = true;
}
}
}
}
}
// res 为结果,即使用这些砖块可以达到的最高高度,初始为0
int res = 0;
for (int i=b[k].a; i>=0; i--) {
if(true == dp[i]) {
res = i;
break;
}
}
cout << res;
return 0;
}