我的魔法会把你撕成碎片
【问题描述】
Alice和Bob在玩一款叫做“HS”的卡牌对战游戏,游戏大体规则如下:
每个玩家初始生命值(LP)为30,生命值上限为30,玩家可以在游戏中通过一些手段削弱对手的生命值,也可以回复自己的生命值,当一个玩家的生命值被降至0点及以下时,该玩家失败,对手胜利。
现在给出共n个操作,操作分为两种,按顺序执行
1:将Alice的生命值加上x
2:将Bob的生命值加上x
(x可能为负数,|x|<=30)
若第一次出现某次操作后,某一玩家的生命值被降至0点及以下,则该玩家失败,对手胜利,游戏结束。
为了方便起见,当n个操作结束后,若无人死亡,则为平局,游戏结束。
最后,Alice想知道最后游戏结束时,双方的生命值分别为多少,以及游戏的结果,你能告诉她吗?
【输入形式】
第一行一个整数 n (n≤1000)代表有n个操作
接下来n行, 每行两个数字 p q ,表示一个操作,具体如下:
操作1 : 格式 0 p 表示Alice的生命值+p
操作2 : 格式 1 q 表示Bob的生命值+q
【输出形式】
第一行输出一个字符串,”Alice” 或 “Bob” 或 “Draw“
若Alice获胜,则输出 “Alice” (注意不包含引号)
若Bob获胜,则输出 “Bob”
若双方平局,则输出 ”Draw”
接下来一行输出两个整数A,B
分别代表游戏结束时Alice和Bob的生命值
【样例输入1】
4
1 -10
1 -10
0 10
1 -20
【样例输出1】
Alice
30 -10
【样例输入2】
10
0 -10
1 -10
0 -20
0 -29
1 -13
0 -3
0 10
1 20
1 -1
0 6
【样例输出2】
Bob
0 20
【样例输入3】
3
0 -1
1 -1
0 1
【样例输出3】
Draw
30 29
【样例解释】
对于样例1,双方血量变动如下
30,30-- Bob-10 -->30,20
30,20-- Bob-10 -->30,10
30,10-- Alice+10 -->30,10(血量上限为30)
30,10-- Bob-20 -->30,-10,Alice获胜.
对于样例2,双方血量变动如下
30,30-- Bob-10 -->30,20
30,30-- Alice-10 -->20,20
30,30-- Alice-20 -->0,20
此时bob获胜,游戏结束
【数据范围】
n<1000 , |x|<=30
【时空限制】
1000ms 64MB
完整代码
#include<stdio.h>
int main()
{
int Alice=30;
int Bob=30;
int n;//操作次数
int i;
int flag;//格式
int p,q;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&flag);
if (flag == 0)
{
scanf("%d",&p);
Alice =Alice+p;
if (Alice>30)
Alice = 30;
if (Alice<=0)
break;
}
else
{
scanf("%d",&q);
Bob =Bob+q;
if (Bob>30)
Bob = 30;
if (Bob<=0)
break;
}
}
if(Alice >0 && Bob>0)
printf("Draw\n %d %d",Alice,Bob);
else if (Alice > Bob)
printf("Alice\n %d %d",Alice,Bob);
else
printf("Bob\n %d %d",Alice,Bob);
return 0;
}
运行结果