题目描述
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。
输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。
输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1
解题思路
- 统计A喝的杯数alose、B喝的杯数blose。看哪一个先超过各自酒量,可以得出谁先倒。
- 如何统计A喝的杯数alose、B喝的杯数blose?做法是,对于输入中的第 i 行(i=3,4,5, …,N),重复执行:
(1)如果A喊的数+B喊的数等于A划出的数,且有A喊的数+B喊的数不等于B划出的数,则alose加1;
(2)如果A喊的数+B喊的数不等于A划出的数,且有A喊的数+B喊的数等于B划出的数,则blose加1。 - 如何得出哪一个人喝酒杯数先超过各自酒量?答案是,在A(或B)输了喝酒的时候,检查alose(或blose)是否大于A的酒量atop(或B的酒量btop)。如果是,那么就得出结论,并跳出上述重复执行流程,不再处理后续的输入。
参考答案
atop, btop = [int(s) for s in input().split()]
num = int(input())
alose = 0
blose = 0
for i in range(num):
ahan, ashouhua, bhan, bshouhua = [int(s) for s in input().split()]
if ahan + bhan == ashouhua and ahan + bhan != bshouhua:
alose += 1
if alose > atop:
loser = 'A'
break
elif ahan + bhan != ashouhua and ahan + bhan == bshouhua:
blose += 1
if blose > btop:
loser = 'B'
break
print(loser)
if loser == 'A':
print(blose)
else:
print(alose)
测试用例
-
题目描述给出的测试用例(即样例输入和样例输出)覆盖了以下情形:A先倒下,另一人喝了酒,部分输入行无需处理。
-
下面给出的测试用例是对题目描述给出的测试用例稍加改造生成的,覆盖了以下情形:有人酒量为0,B先倒下。
样例输入
1 0
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
样例输出
B
1 -
下面给出的测试用例是对题目描述给出的测试用例稍加改造生成的,覆盖了以下情形:酒量为0。
样例输入
0 0
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
样例输出
A
0 -
酒量大的人先倒下的情形。
样例输入
2 3
8
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
7 9 8 15
7 9 8 15
样例输出
B
2
小结
- 答题之前首先要理清题意。
- 基于题目描述给出的测试用例,稍加改造可以生成新的测试用例。不同的测试用例考察与题目相关的不同关注点。