Codeforces Round 908 (Div 2——AB)

A. Secret Sport

题目

Codeforces Round 908 (Div 2——AB)_第1张图片

 AB二人玩游戏,每一局(plays)游戏会有一个获胜者,首先获胜X局(play)的玩家得一分(赢得一轮sets)。率先获得Y分的玩家获得最终胜利。

给你整场游戏的每局(plays)获胜情况,在不知道X和Y的情况下,判断游戏的获胜者。

(英语阅读做了多半个小时o(╥﹏╥)o)

输入

首行测试样例数t,1 \leq t \leq 10^{4}

每个样例首行,局数(plays)n,1 \leq n \leq 20

第二行长度为n的字符串s,每个字符由A或B组成,代表每局的获胜者

输出

每个样例的游戏获胜者,A或B

解析

Codeforces Round 908 (Div 2——AB)_第2张图片

plays数最大为20,故可通过枚举的方式试错X和Y。另外一种解决方式是个脑筋急转弯,对于这样一个样例“ABBAA”,倒着看,最后一局胜者是A,且游戏结束。那么此局(play)过后,A在当前轮次(set)获胜,即获胜X个plays。同样因为此set过后游戏结束,故当前set获胜者一定积累了Y个set分。

代码


for t in range(int(input().strip())):
    n = int(input().strip())
    s = input().strip()

    print(s[-1])

B.Two Out of Three

题目

Codeforces Round 908 (Div 2——AB)_第3张图片

 给定数组a,找到一个只包含1,2和3元素的数组b,使其满足且只满足以下三个条件中的两个:

1、存在1 \leq i, j \leq n,使得a_{i} = a_{j}b_{i} = 1b_{j} = 2

2、存在1 \leq i, j \leq n,使得a_{i} = a_{j}b_{i} = 1b_{j} = 3

3、存在1 \leq i, j \leq n,使得a_{i} = a_{j}b_{i} = 2b_{j} = 3

输入

首行测试样例数t,1 \leq t \leq 500

每组样例首行,数组a的长度n,1 \leq n \leq 100

第二行数组a,1 \leq a_{i} \leq 100

输出

满足条件的数组b,如误解输出-1

解析

Codeforces Round 908 (Div 2——AB)_第4张图片

 三个条件是等价的,满足任两个即可。假设满足(1,2)和(1,3),数组a只需保证有两个不同的数字出现次数在两次以上既能满足要求。假设有两个数字x和y满足这个要求,只需a_{i} = x -> b_{i} = 2a_{i} = y -> 3。这样不会有(2,3)的冲突

代码

N = 110

def solve():
    n = int(input().strip())
    a = list(map(int, input().strip().split()))
    b = [1] * n
    inds = [list() for i in range(N)]

    for i in range(n):
        inds[a[i]].append(i)

    k = 2
    for x in range(1, 101):
        if len(inds[x]) >= 2:
            b[inds[x][0]] = k
            k += 1
            if k > 3:
                break

    if k <= 3:
        print(-1)
    else:
        for i in b:
            print(i, end=" ")
        print()

for t in range(int(input().strip())):
    solve()

你可能感兴趣的:(算法笔记,算法,codeforces)