你在一款RPG游戏中打一个木桩,木桩血量无限,有一定防御力d,你有一定攻击力a,每个回合你可进行四种操作中的一种1攻击敌方,造成你的攻击力减去敌方防御力的伤害,最小为1。
1.暂时强化自身攻击,使自身攻击力翻倍,持续c2个回合(当前回合不计),可叠加,叠加时按加法计算(叠加n层,攻击力为n+1倍)
2.暂时破除敌方防御,使敌方防御力变为θ,持续c3回合(当前回合不计),叠加时覆盖之前的效果使自身攻击永久增加c4,若此时有攻击buff(特效),则增加的部分也会受buff加成现给你上述提到的各项数值和操作序列,请计算造成的总伤害
输入描述
第一行六个空格隔开的正整数n,a,d,c2,c3,c4.n为操作序列的长度,即回合数,其他见问题描述。六个正整数均不大于1009。,其中c2,c3不大于n第二行一个长度为n,由1,2,3,4组成的字符串,表示操作序列,1~4分别对应上面的四种操作输出描述
个整数,表示伤害。保证答案不超过1e18。
样例输入
6 3 3 6 6 2
121341
样例输出
14
思路:
将BUFF定义为一个类,每次攻击前检测BUFF时间,决定攻击、防御系数,存在就调用BUFF类中的信息,为基础攻击附加伤害。
#include<iostream>
using namespace std;
class Buff
{
public:
Buff(int a, int b) : c2(a), c3(b) {};
void AttackBuffOn();
void AttackBuffOff();
void ReduceDefenceBuffOn();
void ReduceDefenceBuffOff();
int AttackBuffX();
int AttackBuffX_2();
int DefenceBuffX();
int DefenceBuffX_2();
void NextCase_ReduceDefenceTime();
void NextCase_AttackBuffTime();
private:
int c2;//攻击力提升 技能 持续回合数~skill
int c3;//破甲debuff 技能 持续回合数~skill
int AttackBuffTime = 0;
int ReduceDefenceTime = 0;
int DeFencePlus = 1;//防御 倍数
int AttackBuffPlus = 1; //buff攻击倍数
};
void Buff::NextCase_ReduceDefenceTime()
{
ReduceDefenceTime--;
}
void Buff::NextCase_AttackBuffTime()
{
AttackBuffTime--;
}
void Buff::AttackBuffOn()
{
AttackBuffPlus++;//攻击力buff激活,加倍
AttackBuffTime = c2;//buff持续时间刷新
}
void Buff::AttackBuffOff()
{
AttackBuffPlus = 1; //攻击力buff关闭
}
void Buff::ReduceDefenceBuffOn()
{
DeFencePlus = 0;
ReduceDefenceTime = c3;
}
void Buff::ReduceDefenceBuffOff()
{
DeFencePlus = 1;
}
int Buff::AttackBuffX()
{
AttackBuffTime--;
if (AttackBuffTime <= 0)
AttackBuffOff();//取消武器祝福增益
return AttackBuffPlus;//攻击力倍数
}
int Buff::AttackBuffX_2()
{
return AttackBuffPlus;//攻击力倍数
}
int Buff::DefenceBuffX()
{
ReduceDefenceTime--;
if (ReduceDefenceTime <= 0)
ReduceDefenceBuffOff();//取消破甲增益
return DeFencePlus;//防御力倍数
}
int Buff::DefenceBuffX_2()
{
return DeFencePlus;//防御力倍数
}
int main()
{
int temp = 0;
int now = 0; //当前回合数
long long attack, defence = 0;
long long hurt = 0;//1e19
char *caozuo;
int n, c2, c3, c4 = 0;
cin >> n >> attack >> defence >> c2 >> c3 >> c4;
caozuo = new char[n];
Buff buff(c2, c3);//初始化buff技能
for (int i = 0; i < n; i++)
cin >> caozuo[i];
//for (int i = 0; i < n; i++)
// cout << caozuo[i]<<" ";
while (1)
{
now++;//当前回合+1
if (now <= n)//当前回合数小于总回合数
{
switch (caozuo[now - 1])
{
case '1':
if (attack * buff.AttackBuffX() - defence * buff.DefenceBuffX() <= 0)
hurt++;
else
{
hurt = hurt + (attack * buff.AttackBuffX_2() - defence * buff.DefenceBuffX_2());
}
break;
case'2':
buff.AttackBuffOn();
buff.NextCase_ReduceDefenceTime();//防御buff减少一回合
break;
case'3':
buff.ReduceDefenceBuffOn();
buff.NextCase_AttackBuffTime();//攻击buff减少一回合
break;
case'4':
attack = attack + c4;
buff.NextCase_AttackBuffTime();
buff.NextCase_ReduceDefenceTime();//攻击、防御buff都减少一回合。
break;
default:
cout << "error!please select your option agian." << endl;
break;
}
}
else
break;
}
cout << hurt;
return 0;
}
-修改了BUFF计算时间减少错误的bug。
没ac。