阴云密布

题目描述

你有三个属性:生命值,魔法值,能量值。你有如下三种基本技能:充能,攻击,魔法。你的初始生命值为W_1W1,能量值和魔法值为00。敌人的初始生命值为W_2W2

战斗有nn轮,每轮你会发动3个基本技能。

攻击Blast: 对于第ii个基本技能,如果它是攻击,设能量值xx,那么伤害为(x+1)cdot A_i(x+1)Ai。然后能量值清0。

充能Charge: 对于第ii个基本技能,如果它是充能,那么伤害为B_iBi。然后能量值增加1。

魔法Accele: 对于第ii个基本技能,如果它是魔法,设能量值xx,那么伤害为lfloorfrac{x+2}{2} floorcdot C_i2x+2Ci,魔法值增加lfloorsqrt{x+1} floorcdot Cx+1C。然后能量值清0。

组合技能Combo: 如果这3个技能都是充能,那么能量值额外增加D_1D1。如果这3个技能都是魔法,那么魔法值额外增加D_2D2。如果这3个技能都是攻击,那么造成的伤害额外增加D_3D3

放大招Magia: 如果魔法值达到E_1E1,那么你会先放大招再执行本轮的三个基本技能。放大招会让生命值增加E_2E2,对敌人造成伤害E_3E3。放完大招后魔法值为E_4E4。当然,E_4<E_1E4<E1

Buff状态: 放完大招后的一轮中,所有技能造成的伤害翻倍(包括额外增加的伤害),受到敌人伤害减半(向下取整)。Buff状态只持续一轮。

每轮若敌人不死,敌人会对你造成X_1X1伤害。此时你的魔法值会增加X_2X2

如果你的生命值降至0或负数,战斗立即结束并输出Lose

如果敌人的生命值降至0或负数,战斗立即结束并输出Win

如果n轮结束后你和敌人都没死,那么输出Error

输入格式

第一行输入n,W_1,W_2n,W1,W2

第二行输入A_1,A_2,A_3,B_1,B_2,B_3,C_1,C_2,C_3,CA1,A2,A3,B1,B2,B3,C1,C2,C3,C。

第三行输入D_1,D_2,D_3,E_1,E_2,E_3,E_4D1,D2,D3,E1,E2,E3,E4

第四行输入X_1,X_2X1,X2

接下来nn行输入每一轮的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

说明/提示

样例1中各时刻状态:

第1轮后,生命值为19922,魔法值为12,能量值为0,敌人生命值为113000

第2轮后,生命值为11922,魔法值为24,能量值为0,敌人生命值为86000

第3轮后,生命值为3922,魔法值为36,能量值为0,敌人生命值为59000

第4轮后,生命值为-4078,魔法值为48,能量值为0,敌人生命值为32000

第一轮的伤害构成为:2000+5000+10000*2=27000

对于30%的数据,n=1n=1

对于60%的数据,一定不会发大招

对于100%的数据,nleq 10^3,W_1,W_2in[1,10^9],A_i,B_i,C_i,D_3,X_1,E_2,E_3in[250,10^5],C,D_2,E_1,E_4,X_2in[0,10^4],D_1in[1,5]n103,W1,W2[1,109],Ai,Bi,Ci,D3,X1,E2,E3[250,105],C,D2,E1,E4,X2[0,104],D1[1,5]

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int main(){
 5     int n,w[3],a[4],b[4],c[5],d[4],e[5],x[3],m1=0,m2=0,buff=0;
 6     char s[10];
 7     cin>>n>>w[1]>>w[2];
 8     cin>>a[1]>>a[2]>>a[3]>>b[1]>>b[2]>>b[3]>>c[1]>>c[2]>>c[3]>>c[4];
 9     cin>>d[1]>>d[2]>>d[3]>>e[1]>>e[2]>>e[3]>>e[4];
10     cin>>x[1]>>x[2];
11     for(int i=1;i<=n;i++){
12         cin>>s;
13         a[0]=0; b[0]=0; c[0]=0;
14         if(m2>=e[1]){
15             w[1]+=e[2];
16             w[2]-=e[3];
17             m2=e[4];
18             buff=1;
19         }
20         for(int j=0;j<3;j++){
21             if(s[j]=='B'){
22                 w[2]-=(m1+1)*a[j+1];
23                 if(buff==1) w[2]-=(m1+1)*a[j+1];
24                 m1=0; b[0]++;
25             }
26             else if(s[j]=='C'){
27                 w[2]-=b[j+1];
28                 if(buff==1) w[2]-=b[j+1];
29                 m1++; c[0]++;
30             }
31             else if(s[j]=='A'){
32                 w[2]-=(m1+2)/2*c[j+1];
33                 if(buff==1) w[2]-=(m1+2)/2*c[j+1];
34                 m2+=sqrt(m1+1)*c[4];
35                 m1=0; a[0]++;
36             }
37         }
38         if(a[0]==3) m2+=d[2];
39         else if(b[0]==3) w[2]-=d[3];
40         else if(c[0]==3) m1+=d[1];
41         if(buff==1&&b[0]==3) w[2]-=d[3];
42         if(w[2]<=0){
43             cout<<"Win";
44             return 0;
45         }
46         if(buff==1) w[1]-=x[1]/2;
47         else w[1]-=x[1];
48         if(w[1]<=0){
49             cout<<"Lose";
50             return 0;
51         }
52         m2+=x[2];
53         buff=0;
54     }
55     cout<<"Error";
56     return 0;
57 }

一道虽然不难,

但是卡了我很久的题,

主要是因为手残,

前面用了c[0]作为题目中的C,

后来还用c[0]计数,

失策啊。

qwq

原文地址:https://www.cnblogs.com/sxy2004/p/12270828.html