Codeforces Round 927 (Div. 3) Python题解(A~E)

A. Thorns and Coins

Problem – A – Codeforces

签到题,贪心,模拟

第一个连续的棘刺前的硬币均能吃到

t = int(input())
for _ in range(t):
    n = int(input())
    s = input().split("**")[0]
    res = s.count("@")
    print(res)

B. Chaya Calendar

Problem – B – Codeforces

数论

下个预言会在下一个能被当前ai整除的年数出现,即(now // a[i] + 1)*a[i]年

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    now = a[0]
    for i in range(1, n):
        now = (now // a[i] + 1)*a[i]
    print(now)

C. LR-remainders

Problem – C – Codeforces

x模拟,数学

要求每个操作前所有元素乘积对m的模数,正着求数字相乘会很大,并且左右都会变化无法用前缀和,但是倒着求,每次添加一个元素,就有一个固定的顺序,当然这样求的答案是倒序的

存一下删除的顺序,逆序求当前的模数,每个位置只使用当前模数相乘即可,记录当前答案,最后将答案逆序打印

t = int(input())
for _ in range(t):
    n, m = map(int, input().split())
    a = list(map(int, input().split()))
    ops = input()
    l, r = 0, n-1
    lis = []
    for op in ops:
        if op == "L":
            lis.append(l)
            l += 1
        else:
            lis.append(r)
            r -= 1
    res = []
    now = 1
    for i in range(n-1, -1, -1):
        now = now * a[lis[i]] % m
        res.append(now)
        i += 1
    for i in range(n-1, -1, -1):
        print(res[i], end=" ")
    print()

D. Card Game

Problem – D – Codeforces

贪心,模拟

每张牌是不重复的,每回合要求一张牌比同色另一张牌大,或者其中一张是王牌,要求构造一种2n张牌都被使用的顺序,

可以发现每种花色是偶数时,该花色两两配对一定能全部用完,而为奇数时,多出的那张只能与任一张王牌配对,记录每种花色和王牌花色数量,然后看能不能都两两配对,即王牌花色足够补奇数剩余花色且剩余的能被二整除

若可以,每种花色从小到大每次取两张,不够时用王牌补,然后接着打印剩余王牌即可

def check():
    num, k = 0, len(al[king])
    for i in al:
        if i != king:
            now = len(al[i])
            if now % 2 != 0:
                num += 1
    return k >= num and (k-num) % 2 == 0


t = int(input())
for _ in range(t):
    n = int(input())
    king = input()
    cards = sorted(input().split())
    al = {'C': [], 'D': [], 'H': [], 'S': []}
    for cd in cards:
        al[cd[1]].append(cd)
    if check():
        k = 0
        for i in al:
            if i != king:
                j, m = 0, len(al[i])
                while j + 1 <= m-1:
                    print(al[i][j], al[i][j+1])
                    j += 2
                if m % 2 != 0:
                    print(al[i][-1], al[king][k])
                    k += 1
        for j in range(k, len(al[king]), 2):
            print(al[king][j], al[king][j+1])
    else:
        print("IMPOSSIBLE")

E. Final Countdown

Problem – E – Codeforces

o模拟,数学,前缀和

每秒钟只能改变一个位数的值一次,直到倒计时归零

要求归零需要多少时间,即求n的所有位需要改变多少次

从个位数看起,个位数需要改变的次数为n次,数字每减一都会改变一次,而十位数则改变n//10次,每大概十次才会改变一次,前面同理

那么只要求前i位数字相加即可

数字的位数为4*1e5,直接求肯定会爆,用列表模拟数字,每个元素存一个位数,每位为前i个元素的前缀和,最后将其转换为十进制即可

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input()))
    s = [0]
    for ai in a:
        s.append(s[-1]+ai)
    resl = [0]
    for i in range(1, n+1):
        resl.append(s[i])
    for i in range(n, 0, -1):
        if resl[i] >= 10:
            resl[i-1] += resl[i]//10
            resl[i] %= 10
    i = 0
    while resl[i] == 0:
        i += 1
    while i < n+1:
        print(resl[i], end="")
        i += 1
    print()

物联沃分享整理
物联沃-IOTWORD物联网 » Codeforces Round 927 (Div. 3) Python题解(A~E)

发表评论