三国风云

先吐槽下题面。。。。。。

感觉题面完全没说明白这一堆变量是干嘛的,最后还是照着题解代码才看懂题/kk

(f[i]) 表示状态为 (i) 时吕布剩余的最大血量。

梳理一下题目要素:

  • 两个人会一直互相攻击直到其中一个死掉,设 a1=max(1,lvatmp-emd[j]),a2=max(1,ema[j]-lvdtmp) ,则吕布剩余的血量 (hp)f[i]-(((emhp[j]+a1-1)/a1)-1)*a2

  • 每打死一个人,吕布就会得到其经验值。经验值每增加 (100) 就升一级。

  • 每升一级,吕布的 (ATI , DEF , HP) 就会分别加上 (In\_ATI,In\_DEF,In\_HP) 。(题面里好像没说?

然后就和上一题思路差不多了吧...

(看过 std 以后再自己写就莫名其妙地越写越像/kk)

#include<bits/stdc++.h>
using namespace std;
const int N=(1<<20)+1;
int f[N],expsum[N],n,m,lva,lvd,lvhp,ina,ind,inhp;//变量含义见题目 
int ema[30],emd[30],emhp[30],emexp[30];char emname[30];//对手的基本信息 
int main()
{
	while(scanf("%d%d%d%d%d%d",&lva,&lvd,&lvhp,&ina,&ind,&inhp)!=EOF)
	{
		scanf("%d",&n);
		m=1<<n;
		for(int i=0;i<=n-1;i++)//因为状态是从0开始算的所以数也要从0开始存 
		{
			scanf("%s%d%d%d%d",emname,&ema[i],&emd[i],&emhp[i],&emexp[i]);
		}
		memset(f,-1,(m<<2)+1);
		f[0]=lvhp;//记得赋初值 
		expsum[0]=0;
		for(int i=0;i<=m-1;i++)
		{
			if(f[i]==-1) continue;
			int t,lev=expsum[i]/100,hp;//lev表示当前等级 
			int lvatmp=lva+lev*ina,lvdtmp=lvd+lev*ind;//计算当前的lva和lvd 
			for(int j=0;j<n;j++)
			{
				int t=1<<j;
				if(i&t) continue;//如果已经杀过j了就返回 
				expsum[i|t]=expsum[i]+emexp[j];
				int a1=max(1,lvatmp-emd[j]),a2=max(1,ema[j]-lvdtmp);
				hp=f[i]-(((emhp[j]+a1-1)/a1)-1)*a2;//计算吕布剩余血量 
				if(hp<=0) continue;//吕布死了 
				if(expsum[i|t]/100>expsum[i]/100) hp+=inhp;//升级 
				f[i|t]=max(f[i|t],hp);//更新答案 
			}
		}
		if(f[m-1]>=0) printf("%d
",f[m-1]);//如果吕布存活就输出答案 
		else printf("Poor LvBu,his period was gone.
");
	}
	return 0;
}//终于写完了QAQ 
原文地址:https://www.cnblogs.com/ying-xue/p/san-guo-feng-yun.html