看见啸爷再看这道题目,也跟着看了看,看懂之后感觉有戏,很裸的背包,果然1A,嘿嘿。
题目大意:给你n种木块,然后让你输出最高可以组成的高度。
限制条件是:每种木块的个数,与木块的在高度h以上就不可以再出现了。
解题思路:根据每种木块可以到达的高度sort一遍然后就是多重背包,找到满足条件的最大的高度。
注意可以到达的最大的高度不会超过sort之后木块可以到达的上限,f[n-1].lim,因为在往上,是不能再搭木块的啊,所以就把这个高度当作,dp的上限,改了一下竟然省了300+ms。。。
Space Elevator
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 7657 | Accepted: 3621 |
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
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-7
#define M 1000100
//#define LL __int64
#define LL long long
#define INF 0x3f3f3f3f
#define PI 3.1415926535898
const int maxn = 500100;
using namespace std;
int dp[maxn];
struct node
{
int h, num, lim;
} f[maxn];
int cmp(node a, node b)
{
return a.lim < b.lim;
}
int main()
{
int n;
cin >>n;
for(int i = 0; i < n; i++)
cin >>f[i].h>>f[i].lim>>f[i].num;
sort(f , f+n, cmp);
memset(dp , 0 , sizeof(dp));
dp[0] = 1;
for(int i = 0; i < n; i++)
{
for(int j = f[n-1].lim; j >= 0; j--)
{
if(!dp[j])
continue;
for(int k = 1; k <= f[i].num; k++)
{
if(j+k*f[i].h <= f[i].lim)
{
if(!dp[j+k*f[i].h])
dp[j+k*f[i].h] = 1;
else
break;
}
}
}
}
int i;
for(i = f[n-1].lim; i >= 0; i--)
if(dp[i])
break;
cout<<i<<endl;
return 0;
}