Python入门习题(51)——团体程序设计天梯赛习题:谁先倒

题目描述

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。

输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过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

解题思路

  1. 统计A喝的杯数alose、B喝的杯数blose。看哪一个先超过各自酒量,可以得出谁先倒。
  2. 如何统计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。
  3. 如何得出哪一个人喝酒杯数先超过各自酒量?答案是,在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)

测试用例

  1. 题目描述给出的测试用例(即样例输入和样例输出)覆盖了以下情形:A先倒下,另一人喝了酒,部分输入行无需处理。

  2. 下面给出的测试用例是对题目描述给出的测试用例稍加改造生成的,覆盖了以下情形:有人酒量为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

  3. 下面给出的测试用例是对题目描述给出的测试用例稍加改造生成的,覆盖了以下情形:酒量为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

  4. 酒量大的人先倒下的情形。
    样例输入
    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

小结

  1. 答题之前首先要理清题意。
  2. 基于题目描述给出的测试用例,稍加改造可以生成新的测试用例。不同的测试用例考察与题目相关的不同关注点。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值