Space Elevator
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7378 | Accepted: 3464 |
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.
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.
* 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.
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;
}