第二届国际赛真题试题A:猜拳

发布时间:2023年12月28日

由于在刷题库里面没找到原题,不知道我这种方法超时时长没有

试题 A:猜拳

【问题描述】
Alice、Bob 和 Cindy 一起玩猜拳的游戏。
和两个人的猜拳类似,每一轮,他们会从石头、剪刀、布中各自选一个出拳,基本的胜负规
则是石头赢剪刀、剪刀赢布、布赢石头。如果一轮中正好可以分成胜负两边,则负边的每个
人要支付给胜边的每个人一块钱。如果无法分成胜负两边,则都不出钱。
比如,如果 Alice 出石头,而 Bob 和 Cindy 都出布,则 Alice 要分支付 Bob 和 Cindy 一块钱。
再如,如果 Alice 出石头,Bob 出剪刀,Cindy 出布,则都不出钱。
他们三人共进行了 n 轮游戏,请问最后每个人净赚多少钱?即赚的钱减去支付的钱是多少?
【输入格式】
输入的第一行包含一个整数 n,表示游戏总共进行了 n 轮。
接下来 n 行,每行三个整数,分别表示 Alice、Bob 和 Cindy 一轮中所出的拳,0 表示石头,
1 表示剪刀,2 表示布。
【输出格式】
输出三个,每行一个整数,分别表示 Alice、Bob 和 Cindy 净赚的钱数。
【样例输入】
3
0 2 2
0 1 2
1 1 1
【样例输出】
-2
1
1
def check(n, x):
    #初始化
    score = [0, 0, 0]
    lose = [0, 0, 0]
    #先假定没有人胜出,lock为假
    lock = False
    #如果存在其中有两项相同,用于存储这两项和另一个数字不一样的位置
    #相同的两项放在列表中的索引0,1
    count = []
    for i in range(n):
        #如果三人的数字一样或者三个人都各不相同就跳过
        if x[i][0] == x[i][1] == x[i][2] or (x[i][0] != x[i][1] and x[i][2] != x[i][1] and x[i][0] != x[i][2]):
            continue
        else:
            for j in range(3):
                #用于判断前者减去后者是否等于-1或2,如果是则前者胜后者输
                if x[i][j] - x[i][(j + 1) % 3] == -1 or x[i][j] - x[i][(j + 1) % 3] == 2:
                    score[j] += 1
                    lose[(j + 1) % 3] += 1
                    #解除锁定,有人胜出
                    lock = True
                #上同,若前者减去后者等于1或-2,则前者输后者胜
                elif x[i][j] - x[i][(j + 1) % 3] == 1 or x[i][j] - x[i][(j + 1)%3]== -2:
                    lose[j] += 1
                    score[(j + 1) % 3] += 1
                    #解除锁定,有人胜出
                    lock = True
                #判断是否有相同项
                elif x[i][j] - x[i][(j + 1) % 3] == 0:
               #前两条语句是将相同两项的位置记录下来,便于后续在相应位置做出lose或score的加分
                    count.append(j)
                    count.append((j + 1) % 3)
                    #不同的那一项的位置
                    count.append((j + 2) % 3)
                elif count:
               #判断,有了相同项并且有人胜出则对相应lose或score做出相应的加分
               #实际上这个判断可以不要,有两个数重复那么肯定就会有输赢,因为平局(三个数相等)
               #的情况已经舍去
                    if lock == True:
                        lose[count[0]] += 1
                        lose[count[1]] += 1
                        score[count[2]] += 2
    #记录净赚的钱
    final=[]
    for m,n in zip(score, lose):
        final.append(m-n)          

    return final     

n = int(input())
x = []
for i in range(n):
    x.append(list(map(int, input().split())))
result = check(n, x)
for i in result:
    print(i)

文章来源:https://blog.csdn.net/xia_o_s_on/article/details/135249350
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。