A. Destroying Bridges
签到题,贪心
只要能使一座岛独立就可以达到最小答案1,即k>=n-1,否则为n
t = int(input())
for _ in range(t):
n, k = map(int, input().split())
res = n
if k >= n-1:
res = 1
else:
res = n
print(res)
B. Equal XOR
贪心,构造
题意,由1到n的数各出现两次组成的数组,将数组从中间分为两半,从两边各取k个数,随意排序,使两边异或和相等
对于每种数字,要么同时出现在一边,要么左右部分各一个,
当其分别出现在左右时,在两边的异或运算,将该数字放在同一位置上,对异或运算结果的影响刚好可以抵消,
当其在一边出现两次时,另一边一定能找到另外一组两个相同的元素,将相同的元素放在一起,异或结果为0,影响同样可以抵消
答案数组元素数量为偶数,计数器存一下两边每种数字数量,两边先使用重复的数字,剩余的分别加上相同的数字即可
from collections import Counter
t = int(input())
for _ in range(t):
n, k = map(int, input().split())
a0 = list(map(int, input().split()))
c1, c2 = Counter(a0[:n]), Counter(a0[n:])
dou_l, dou_r = [i for i in c1 if c1[i] == 2], [i for i in c2 if c2[i] == 2]
same = [i for i in c1 if c1[i] == 1]
l, r = [], []
k *= 2
while k > 0 and dou_l:
li, ri = dou_l.pop(), dou_r.pop()
for i in range(2):
l.append(li)
r.append(ri)
k -= 2
while k > 0:
si = same.pop()
l.append(si)
r.append(si)
k -= 1
for li in l:
print(li, end=" ")
print()
for ri in r:
print(ri, end=" ")
print()
C. MEX Game 1
贪心,博弈论
爱丽丝会尽量使c中第一个未出现的数字更大,鲍勃相反,两人轮流选择插入或删除,爱丽丝先手,求该数字的最大值
可以发现,当爱丽丝将一个数字作为数组中的最大值,且前面的数字都至少出现一次时,该数字及其前面的数字中数量为1的数字一定不可超过两个,
因为有一个数量为1的数字时,她可以先手将该数字选入数组,否则鲍勃一定会将另一个次数为1的元素删除,导致无法达成结果
结果一定小于等于n,遍历0到n的数字,找前面只有一个出现次数为1的数字的最大的结果即可,
当第一次出现出现次数为0的数字时,该数字即为答案,否则为最大的数字加一
from collections import Counter
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
c = Counter(a)
res = 0
flag = 0
for i in range(n):
if c[i] == 0:
res = i
break
elif c[i] == 1:
if flag:
break
flag = 1
res = i+1
print(res)