Codeforces Round #934 (Div2)(A~C)python

A. Destroying Bridges

Problem - A - Codeforces

签到题,贪心

f1ec04b335b84cb3ae4458a8e187d81f.png

只要能使一座岛独立就可以达到最小答案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

Problem - B - Codeforces

贪心,构造

7bf3edeb74204106bb7194db0fe1f221.png

题意,由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

Problem - C - Codeforces

贪心,博弈论

6e2ea2db66d1488a8160bb4a627e7161.png

爱丽丝会尽量使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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值