题目连接;http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26405#problem/H
本题开始用的递归,超时了,要用队列。
AC代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct p
{
int hp;
int sth;
int sp;
int mp;
int step;
char way[100];
}a,b;
queue<p>Q;
int n,sth[100],sp[100],mp[100],H[150][150][150];
bool deal()
{
while(!Q.empty())
{
b=Q.front();
Q.pop();
if(b.step==n+1)
{
for(int i=1;i<=n;i++)
printf("%c",b.way[i]);
printf("\n");
return true;
}
if(b.sth>=sth[b.step])
{
a=b;
a.hp-=(2*sth[b.step]-b.sth)>0?(2*sth[b.step]-b.sth):0;
a.sth++;
a.step++;
if(a.hp>H[a.sth][a.sp][a.mp])
{
H[a.sth][a.sp][a.mp]=a.hp;
a.way[a.step-1]='D';
Q.push(a);
}
}
if(b.sp>=sp[b.step]&&b.mp>=mp[b.step])
{
a=b;
a.mp-=mp[b.step];
a.sp++;
a.step++;
if(a.hp>H[a.sth][a.sp][a.mp])
{
H[a.sth][a.sp][a.mp]=a.hp;
a.way[a.step-1]='E';
Q.push(a);
}
}
}
return false;
}
int main()
{
while(~scanf("%d%d%d%d%d",&n,&a.hp,&a.sth,&a.sp,&a.mp))
{
a.step=1;
while(!Q.empty())Q.pop();
memset(H,0,sizeof(H));
H[a.sth][a.sp][a.mp]=a.hp;
Q.push(a);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&sth[i],&sp[i],&mp[i]);
if(!deal())printf("UNLUCKY\n");
}
return 0;
}
TL代码:
#include<stdio.h>
int si[100];
int pi[100];
int mi[100];
int n,hh,ss,pp,mm;
char mark[100];
int maxx(int a,int b){
if(a>b) return a;
else return b;
}
int flag=0;
void deal(int i,int h,int s,int p,int m){
int temp,ah=h,as=s;
if(s>=si[i]){
temp=2*si[i]-s;
int ma=maxx(temp,0);
h-=ma;
//printf("%d h=%d s=%d p=%d m=%d\n",i,h,s,p,m);
if(h<=0){
//printf("+++\n");
if(m>=mi[i]&&p>=pi[i]){
// printf("---\n");
m-=mi[i];
p+=1;
// printf("%d h=%d s=%d p=%d m=%d\n",i,ah,as,p,m);
if(i==n-1){
flag=1;
mark[i]='E';
// printf("mark[i]=%c\n",mark[i]);
return ;
}
mark[i]='E';
deal(i+1,ah,as,p,m);
}
return;
}
s+=1;
if(i==n-1){
mark[i]='D';
//printf("mark[i]=%c\n",mark[i]);
flag=1;
return;
}
mark[i]='D';
deal(i+1,h,s,p,m);
}
if(flag==1) return;
if(m>=mi[i]&&p>=pi[i]){
m-=mi[i];
p+=1;
//printf("%d h=%d s=%d p=%d m=%d\n",i,h,s,p,m);
if(i==n-1){
flag=1;
mark[i]='E';
//printf("mark[i]=%c\n",mark[i]);
return ;
}
mark[i]='E';
deal(i+1,ah,as,p,m);
}
}
int main(){
int i;
while(~scanf("%d %d %d %d %d",&n,&hh,&ss,&pp,&mm)){
flag=0;
for(i=0;i<n;i++){
scanf("%d %d %d",&si[i],&pi[i],&mi[i]);
}
deal(0,hh,ss,pp,mm);
if(flag==0) printf("UNLUCKY\n");
else{
for(i=0;i<n;i++){
printf("%c",mark[i]);
}
puts("");
}
}
return 0;
}