tyvj1086 Elevator

时间:2023-12-09 12:37:55

背景

广东汕头聿怀初中 Train#2 Problem4

描述

现有N种箱子,每种箱子高度H_i,数量C_i。现选取若干箱子堆成一列,且第i种箱子不能放在高度超过A_i的地方。试求最大叠放高度。

输入格式

第一行,一个整数,表示箱子种类N。
接下来N行,每行三个整数,表示H_i,A_i,C_i。

输出格式

一个整数,表示最大高度。

测试样例1

输入


7 40 3 
5 23 8 
2 52 6

输出

48

备注

N <= 400 , H_i <= 100 , C_i <= 10 , A_i <= 40000
Vivian Snow
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,k,hc,h[],c[],a[],ans;
bool f[];
struct ITM{
int h;
int c;
int a;
}temp;
bool cmp(ITM x,ITM y){
return x.a < y.a;
}
vector<ITM> itm;
int main(){
cin>>n;
for(int i = ;i <= n;i++){
scanf("%d%d%d",&h[i],&a[i],&c[i]);
k = ;
while(c[i] >= k){
temp.a = a[i];
temp.c = k;
temp.h = h[i];
c[i] -= k;
k <<= ;
itm.push_back(temp);
}
if(c[i]){
temp.a = a[i];
temp.c = c[i];
temp.h = h[i];
itm.push_back(temp);
}
}
sort(itm.begin(),itm.end(),cmp);
n = itm.size();
f[] = true;
for(int i = ;i < n;i++){
hc = itm[i].h*itm[i].c;
for(int j = itm[i].a;j >= itm[i].h;j--){
if(f[j-hc]) f[j] = true;
if(f[j]) ans = max(ans,j);
}
}
cout<<ans;
return ;
}