POJ 2392 Space Elevator (多重背包+优化)
2013-10-01 22:43
393 查看
[align=center]Space Elevator[/align]
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
Sample Output
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
USACO 2005 March Gold
题意:
有一头牛想要建一座石塔,他有很多不同类型的石块。
每类石块有三个属性:1. (h): 石块的高度;2. (a): 石块能达到的最大高度;3. (c): 石块的数量
思路:
采用多重背包。
注意点:在做背包前需要对石块能到达的最大高度(a)进行排序,防止石塔到了一定高度后,剩下的一些石块所能达到的最大高度小于这个高度,那剩下的这些石块也就不能往上放了。排序时按升序排序,先放能达到最大高度小的石块。
优化:直接标记能到达的最高点。
优化后
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7378 | Accepted: 3464 |
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
USACO 2005 March Gold
题意:
有一头牛想要建一座石塔,他有很多不同类型的石块。
每类石块有三个属性:1. (h): 石块的高度;2. (a): 石块能达到的最大高度;3. (c): 石块的数量
思路:
采用多重背包。
注意点:在做背包前需要对石块能到达的最大高度(a)进行排序,防止石塔到了一定高度后,剩下的一些石块所能达到的最大高度小于这个高度,那剩下的这些石块也就不能往上放了。排序时按升序排序,先放能达到最大高度小的石块。
优化:直接标记能到达的最高点。
/************************************************************************* > File Name: C.cpp > Author: BSlin > Mail: > Created Time: 2013年10月01日 星期二 19时18分57秒 ************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <algorithm> #include <iterator> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #define MP make_pair #define INF (1<<30) #define PI acos(-1.0) #define esp 1e-8 const int dx[4]={0,0,0,0}; using namespace std; #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) #if defined (_WIN32) || defined (__WIN32) || defined (WIN32) || defined (__WIN32__) #define LL __int64 #define LLS "%" "I" "6" "4" "d" #else #define LL long long #define LLS "%" "l" "l" "d" #endif struct node { int h,a,c; bool operator < (const node b) const { return a < b.a; } }data[410]; int dp[40010]; int main(int argc, char** argv) { //read; int n,ans; while(scanf("%d",&n) != EOF) { memset(dp,0,sizeof(dp)); ans = 0; for(int i=0; i<n; i++) { scanf("%d%d%d",&data[i].h,&data[i].a,&data[i].c); data[i].c = min(data[i].c,data[i].a/data[i].h); } sort(data,data+n); for(int i=0; i<n; i++) { for(int j=0; j<data[i].c; j++) { for(int k=data[i].a; k>=data[i].h; k--) { //不会覆盖到以后的值 dp[k] = max(dp[k],dp[k-data[i].h] + data[i].h); if(ans < dp[k]) ans = dp[k]; } } } printf("%d\n",ans); } return 0; }
优化后
/************************************************************************* > File Name: CC.cpp > Author: BSlin > Mail: > Created Time: 2013年10月01日 星期二 21时25分11秒 ************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <cmath> #include <algorithm> #include <iterator> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #define MP make_pair #define INF (1<<30) #define PI acos(-1.0) #define esp 1e-8 const int dx[4]={0,0,0,0}; using namespace std; #define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout) #if defined (_WIN32) || defined (__WIN32) || defined (WIN32) || defined (__WIN32__) #define LL __int64 #define LLS "%" "I" "6" "4" "d" #else #define LL long long #define LLS "%" "l" "l" "d" #endif struct node { int h,a,c; bool operator < (const node b) const { return a < b.a; } }data[410]; bool dp[40010]; int cnt[40010]; int main(int argc, char** argv) { //read; int n,ans; while(scanf("%d",&n) != EOF) { memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) { scanf("%d%d%d",&data[i].h,&data[i].a,&data[i].c); } sort(data,data + n); dp[0] = 1; ans = 0; for(int i=0; i<n; i++) { memset(cnt,0,sizeof(cnt)); for(int j=data[i].h; j<=data[i].a; j++) { if(!dp[j] && dp[j-data[i].h] && cnt[j-data[i].h] + 1 <= data[i].c) { dp[j] = true; cnt[j] = cnt[j-data[i].h] + 1; if(ans < j) ans = j; } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 2392 Space Elevator(多重背包 + 倍增优化)
- poj 2392 Space Elevator(排序+多重背包)
- poj 2392 Space Elevator (多重背包)
- poj 2392 Space Elevator(dp 排序+多重背包)
- poj 2392 Space Elevator (多重背包)
- POJ 题目2392 Space Elevator(多重背包)
- poj2392 Space Elevator(多重背包)
- poj 2392 Space Elevator(多重背包)
- POJ 2392-Space Elevator(多重背包)
- POJ 2392 Space Elevator (多重背包 + 思路题)
- POJ 2392 Space Elevator(多重背包)
- POJ 2392 Space Elevator (多重背包问题)
- POJ 2392 Space Elevator(贪心+多重背包)
- POJ 2392 Space Elevator(多重背包变形)
- POJ 2392-Space Elevator(多重部分和-多重背包)
- POJ - 2392 Space Elevator(多重背包)
- poj 2392 Space Elevator(多重背包变形)
- POJ 2392 Space Elevator(多重背包)
- POJ_2392 Space Elevator(多重背包)
- poj 2392 Space Elevator (多重背包)