模拟赛(二):T118878 阴云密布(代码极度哲学,慎点)
2020.2.6
模拟赛(二)
T1 阴云密布(改编)
题目描述
杰哥有三个属性:生命值,魔法值,能量值。杰哥有如下三种基本技能:充能,攻击,魔法。杰哥的初始生命值Ht1,能量值和魔法值为0。阿伟的初始生命值为Ht2。
战斗有n轮,每轮杰哥会发动3个基本技能(杰哥耍赖。
攻击Blast: 对于第i个基本技能,如果它是攻击,设能量值Pw,那么伤害为(Pw+1)⋅Fst1i。然后能量值清0。
充能Charge: 对于第i个基本技能,如果它是充能,那么伤害为Elci。然后能量值增加1。
魔法Accele: 对于第i个基本技能,如果它是魔法,设能量值Pw,那么伤害为⌊2x+2⌋⋅Fai,魔法值增加⌊x+1⌋⋅Fa然后能量值清0。
组合技能Combo: 如果这3个技能都是充能,那么能量值额外增加Cmb1。如果这3个技能都是魔法,那么魔法值额外增加Cmb2。如果这3个技能都是攻击,那么造成的伤害额外增加Cmb3。
放大招Magia: 如果魔法值达到Dark1,那么你会先放大招再执行本轮的三个基本技能。放大招会让生命值增加Dark2,对敌人造成伤害Dark3。放完大招后魔法值为Dark4。当然,Dark4<Dark1。
Buff状态(无双暴气): 放完大招后的一轮中,所有技能造成的伤害翻倍(包括额外增加的伤害),受到敌人伤害减半(向下取整)。Buff状态只持续一轮。
每轮若阿伟不死,阿伟会对杰哥造成Fst2伤害。此时你杰哥魔法值会怒增Agr。
输入格式
第一行输入n,Ht1,Ht2
第二行输入Fst11,Fst12,Fst13,Elc1,Elc2,Elc3,Fa1,Fa2,Fa3,Fa。
第三行输入Cmb1,Cmb2,Cmb3,Dark1,Dark2,Dark3,Dark4。
第四行输入Fst2,Agr。
接下来n行输入每一轮的3个技能,每行三个字母,B表示攻击,C表示充能,A表示魔法。
输出格式
输出一行字符串。字符串应是Lose
、Win
、Error
中的一个。
输入输出样例
输入 #1
4 27922 140000
7000 8000 10000 4000 5000 6000 2000 3000 4000 7
2 20 3000 100 0 200000 40
8000 5
ACB
ACB
ACB
ACB
输出 #1
Lose
输入 #2
3 27922 140000
7000 8000 10000 4000 5000 6000 2000 3000 4000 9
2 20 3000 100 0 200000 40
8000 5
AAA
AAA
AAA
输出 #2
Win
输入 #3
3 27922 140000
7000 8000 10000 4000 5000 6000 2000 3000 4000 7
2 20 3000 100 0 200000 40
8000 5
CBA
CAB
CCB
输出 #3
Error
题解:
游戏的编写,这是一道简单模拟,初学者都会。
这题输入是真的神仙,第一行三个数,第二行10个数,第三行7个数,第四行2个数,还没开始循环,已经输入22个变量了。
模拟就是了,暴力即正解
自己的AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;//在这款游戏中,你将操作杰哥,和阿伟斗法
long long n, Ht1/*杰哥的血*/, Ht2/*阿伟的血*/,Pw=0/*杰哥没有内力*/,Mgc=0/*杰哥当然也没有法力*/,Fst1[4]/*杰哥的铁拳*/,Fst2/*阿伟的铁拳*/, Agr/*杰哥挨揍的怒气*/,Elc[4]/*杰哥充电器漏的电*/, Fa[4]/*杰哥奇妙魔FA♂*/, Cmb[4]/*杰哥连击*/, Dark[5]/*杰哥Dark♂招*/;
char Do[4];//每回合杰哥的3个基础技能
bool Buff = 0;//杰哥无双暴气
int main() {
scanf("%lld%lld%lld", &n, &Ht1, &Ht2);
scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld%lld", &Fst1[1], &Fst1[2], &Fst1[3], &Elc[1], &Elc[2], &Elc[3], &Fa[1], &Fa[2], &Fa[3], &Fa[0]);
scanf("%lld%lld%lld%lld%lld%lld%lld", &Cmb[1], &Cmb[2], &Cmb[3], &Dark[1], &Dark[2], &Dark[3], &Dark[4]);
scanf("%lld%lld", &Fst2, &Agr);//以上全是输入
for (int i = 1; i <= n; i++) {//n个回合
if (Mgc >= Dark[1]) {//判断能否放Dark♂招
Ht1 += Dark[2];//自我治疗
Ht2 -= Dark[3];//阿伟受到攻击
Mgc = Dark[4];//魔法值增长
Buff = 1;//开启无双暴气模式
}
scanf("%s", &Do);//本轮操作
for (int j = 1; j <= 3; j++) {//三组操作
if (Do[j-1] == 'A') {//Magic
if (Buff) {
Ht2 -= (((Pw + 2) / 2) * Fa[j] * 2);//buff加持,双倍攻击
}
else {
Ht2 -= (((Pw + 2) / 2) * Fa[j]);//魔法攻击
}
Mgc += (int(sqrt(Pw + 1) / 1) * Fa[0]);//杰哥魔法增加
Pw = 0;//能量耗尽
}
if (Do[j-1] == 'B') {//Attack
if (Buff) {
Ht2 -= ((Pw + 1) * Fst1[j] * 2);//buff加持,双倍攻击
}
else {
Ht2 -= ((Pw + 1) * Fst1[j]);//杰哥一拳
}
Pw = 0;//能量耗尽
}
if (Do[j-1] == 'C') {//Charge
if (Buff) {//buff加持,漏电更多
Ht2 -= (2 * Elc[j]);
}
else {
Ht2 -= Elc[j];//阿伟被漏电事故重伤
}
Pw ++;//能量补充
}
if (Ht2 <= 0) {//AWSL
cout << "Win" << endl;
return 0;
}
}
if ((Do[0] == Do[1]) && (Do[1] == Do[2])) {//三个操作相同触发Combo
if (Do[0] == 'A') {//额外魔法奖励Super Magic
Mgc += Cmb[2];
}
if (Do[0] == 'B') {//额外攻击奖励Super Attack
if (Buff) {
Ht2 -= (Cmb[3] * 2);//奖励也有Buff加持
}
else {
Ht2 -= Cmb[3];
}
}
if (Do[0] == 'C') {//额外能量奖励Super Charge
Pw += Cmb[1];
}
}
if (Ht2 <= 0) {//AWSL
cout << "Win" << endl;
return 0;
}
if (Buff) {//buff加持下,阿伟变弱
Ht1 -= (Fst2 / 2);//AW Attack
}
else {
Ht1 -= Fst2;//AW Attack
}
Mgc += Agr;//杰哥 Angry
if (Ht1 <= 0) {//杰哥死了
cout << "Lose" << endl;
return 0;
}
Buff = 0;//一轮过后,buff消失
}
cout << "Error" << endl;//幸福生活
return 0;
}