A. Secret Sport
题目
AB二人玩游戏,每一局(plays)游戏会有一个获胜者,首先获胜X局(play)的玩家得一分(赢得一轮sets)。率先获得Y分的玩家获得最终胜利。
给你整场游戏的每局(plays)获胜情况,在不知道X和Y的情况下,判断游戏的获胜者。
(英语阅读做了多半个小时o(╥﹏╥)o)
输入
首行测试样例数t,
每个样例首行,局数(plays)n,
第二行长度为n的字符串s,每个字符由A或B组成,代表每局的获胜者
输出
每个样例的游戏获胜者,A或B
解析
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
题目
给定数组a,找到一个只包含1,2和3元素的数组b,使其满足且只满足以下三个条件中的两个:
1、存在,使得,,
2、存在,使得,,
3、存在,使得,,
输入
首行测试样例数t,
每组样例首行,数组a的长度n,
第二行数组a,
输出
满足条件的数组b,如误解输出-1
解析
三个条件是等价的,满足任两个即可。假设满足(1,2)和(1,3),数组a只需保证有两个不同的数字出现次数在两次以上既能满足要求。假设有两个数字x和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()