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

A. We Got Everything Covered!

Problem - A - Codeforces

签到题,构造

题意构造一个字符串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

要求将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

构造,数据结构,字典

与第一题情况类似,但要求判断指定的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
    res = ""
    for si in s:
        if ord(si)-97 >= k:
            continue
        c[si] += 1
        if len(c) >= k:
            num += 1
            res += 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:
                res += si
                break
        if len(res) < n:
            res += "a"*(n-len(res))
        print(res)

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值