三国风云
先吐槽下题面。。。。。。
感觉题面完全没说明白这一堆变量是干嘛的,最后还是照着题解代码才看懂题/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\n",f[m-1]);//如果吕布存活就输出答案
else printf("Poor LvBu,his period was gone.\n");
}
return 0;
}//终于写完了QAQ
本文来自博客园,作者:樱雪喵,转载请注明原文链接:https://www.cnblogs.com/ying-xue/p/san-guo-feng-yun.html