Codeforces Round 921 (Div. 2)(A~C)python

A. We Got Everything Covered!

Problem - A - Codeforces

签到题,构造

Codeforces Round 921 (Div. 2)(A~C)python_第1张图片

题意构造一个字符串s,让长度为n且使用字母表前k个小写字母的所有任意组合,都包含于s的所有子串内,即找出一个包含所有情况的s(难懂)

打印n遍'a'开始的k个字母表字符即可

t = int(input())

for _ in range(t):

    n, k = map(int, input().split())

    s = ""

    for i in range(ord('a'), ord("a")+k):

        s += chr(i)

    print(s*n)

B. A Balanced Problemset?

Problem - B - Codeforces

数学知识,分解质因数,搜索,dfs

Codeforces Round 921 (Div. 2)(A~C)python_第2张图片

要求将x分解成n个数之和,求这n个数可能的最大公因数gcd

先将x分解质因数,然后用x一部分质因数,来构造一个刚好大于等于n的因数,用这个因数来分解x,这样剩下的因子的乘积就为他们的最大的gcd

分解后使用dfs搜索,找到每个质因子选取个数不同的一种最佳的组合,x最多不超过26个因子,然后用x除以这个刚好的因数即为答案

import sys
sys.setrecursionlimit(10000000)


def divide(n):
    div = []
    i = 2
    while i <= n/i:
        if n%i == 0:
            s = 0
            while n%i == 0:
                n //=i
                s += 1
            div.append([i, s])
        i += 1
    if n > 1:
        div.append([n, 1])
    return div


def dfs(u, now):
    global div, ma
    if u == len(div):
        if n <= now < ma:
            ma = now
        return
    ne = now
    for i in range(div[u][1]+1):
        dfs(u+1, ne)
        ne *= div[u][0]


t = int(input())
for _ in range(t):
    x, n = map(int, input().split())
    div = divide(x)
    ma = x
    dfs(0, 1)
    res = x//ma
    print(res)

C. Did We Get Everything Covered?

Problem - C - Codeforces

构造,数据结构,字典

Codeforces Round 921 (Div. 2)(A~C)python_第3张图片

与第一题情况类似,但要求判断指定的s是否符合标准,并输出一个s不包含的错误样例

遍历一遍s,使用计数器记录前k种字符每种字符的数量,

都出现过一次后,那么他能表示的n就多一位,将计数器清空,保存答案,并将最后一个仅出现一次的字符保存,便于制造错误样例

遍历结束后,若n不达标,那么取先前每组中只出现一次的字符和最后计数器中不存在的一个字符,组合即为答案(不足n位时需用任意字符补位)

from collections import Counter
t = int(input())
for _ in range(t):
    n, k, m = map(int, input().split())
    s = input()
    c = Counter()
    num = 0
    ls = []
    for si in s:
        if ord(si)-97 >= k:
            continue
        c[si] += 1
        if len(c) >= k:
            num += 1
            ls.append(si)
            c = Counter()
            if num >= n:
                break
    if num >= n:
        print("YES")
    else:
        print("NO")
        for i in range(ord("a"), ord("a")+k):
            si = chr(i)
            if c[si] == 0:
                ls.append(si)
                break
        res = "".join(ls)
        if len(res) < n:
            res += "a"*(n-len(res))
        print(res)

你可能感兴趣的:(开发语言,python,算法,c++)