比赛 20150423 评测结果 AAAAAAAAAAAAAA
题目名称 守卫标志物 最终得分 100
用户昵称 cstdio 运行时间 2.082 s
代码语言 C++ 内存使用 15.15 MiB
提交时间 2015-04-23 09:30:51
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<cstdlib>
using namespace std;
typedef long long LL;
const LL INF=1e18;
const int SIZEN=30;
LL F[1<<20]={0};
LL SH[1<<20]={0};
int N;
LL H;
LL height[SIZEN],mass[SIZEN],strength[SIZEN];
void work(void){
	memset(F,-1,sizeof(F));
	F[0]=INF;
	LL ans=-1;
	for(int s=1;s<(1<<N);s++){
		for(int i=0;i<N;i++){
			if((s>>i)&1){
				int t=s^(1<<i);
				if(mass[i]>F[t]) continue;
				SH[s]=SH[t]+height[i];
				F[s]=max(F[s],min(strength[i],F[t]-mass[i]));
			}
		}
		if(SH[s]>=H){
			ans=max(ans,F[s]);
		}
	}
	if(ans==-1) cout<<"Mark is too tall"<<endl;
	else cout<<ans<<endl;
}
void read(void){
	cin>>N>>H;
	for(int i=0;i<N;i++) cin>>height[i]>>mass[i]>>strength[i];
}
int main(){
	freopen("guardc.in","r",stdin);
	freopen("guardc.out","w",stdout);
	read();
	work();
	return 0;
}