http://acm.hdu.edu.cn/showproblem.php?pid=2809
HH大牛出的题目,比赛的时候被唬住了没有去做,今天兴致来了认真敲了一下,秒杀
这题跟1074doing homework一样,位压缩,没的说,自底向上计算,见图
#include<iostream>
using namespace std;
#define N 1100000
int m,n,hp,ati,def;
struct node{
int ati;
int def;
int hp;
int lv;
int exp;
}q[N],tt;
struct man{
int ati;
int def;
int hp;
int exp;
}man[21];
int max(int a,int b)
{
return a>b?a:b;
}
int war(int j,int i)
{
int time;
time=man[i].hp/max(1,q[j].ati-man[i].def);
if(man[i].hp%max(1,q[j].ati-man[i].def)==0)
time--;
if(time>=0)
return time;
return -1;
}
void dp()
{
int i,j,time,add,temp,next;
for(j=0;j<m;j++)
{
if(q[j].hp<=0)
continue;
for(i=0;i<n;i++)
{
temp=j>>i;
if(temp&1)
continue;
else
next=j+(1<<i);
if((time=war(j,i))==-1)
continue;//战斗失败,continue
tt=q[j];
tt.hp-=time*max(1,man[i].ati-tt.def);
tt.exp+=man[i].exp;
if(tt.exp>=100)
{
add=tt.exp/100;
tt.exp%=100;
tt.ati+=add*ati;
tt.def+=add*def;
tt.hp+=add*hp;
tt.lv+=add;
}
if(q[next].hp==0||tt.hp>q[next].hp||(q[next].hp==tt.hp&&(tt.lv*100+tt.exp)>(q[next].lv*100+q[next].exp)))
{
q[next]=tt;
}
}
q[j].hp=0;
}
}
int main()
{
int i;
char name[22];
while(scanf("%d%d%d%d%d%d",&q[0].ati,&q[0].def,&q[0].hp,&ati,&def,&hp)>0)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s%d%d%d%d",name,&man[i].ati,&man[i].def,&man[i].hp,&man[i].exp);
m=(1<<n)-1;
q[0].lv=1;
q[0].exp=0;
for(i=1;i<=m;i++)
{
q[i].hp=0;
}
dp();
if(q[m].hp>0)
printf("%d\n",q[m].hp);
else
printf("Poor LvBu,his period was gone.\n");
}
return 0;
}
posted on 2009-11-26 20:46
西风萧瑟 阅读(1440)
评论(0) 编辑 收藏 引用 所属分类:
动态规划