模拟赛(二):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表示魔法。

输出格式

输出一行字符串。字符串应是LoseWinError中的一个。

输入输出样例

输入 #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;
}
posted @ 2020-02-06 22:06  Wild_Donkey  阅读(298)  评论(0编辑  收藏  举报