Codeforces Round #905(Div.3)

A. Morning

题目

给定4位数字码,每位数字取值0-9。排列顺序如下: 

Codeforces Round #905(Div.3)_第1张图片

 初始光标指向1,每次可执行其中一个操作

        1、输出光标所指数字

        2、移动光标到相邻位置上。如3可移动到2或4,其中1只能移动到2,0只能移动到9。

问,需要进行多少次操作,能够得到给定的4位数字码。

输入

第一行为测试样例数t,取值范围1\leq t\leq 10^{4}

接下来t行,每行包含一个4位数字码

输出

输出t行,每行位得到此数字码需要的操作次数。

解析

 依次遍历4位数字,记录光标移动到当前数字的移动次数,累加即为结果。因为输出数字也是一次操作,故最后需要加上4。

代码


T = int(input().strip())

for t in range(T):
    n = input().strip()

    cur = 1
    res = 0
    for i in n:
        i = int(i)
        if i == 0:
            i = 10
        res = res + abs(i - cur)
        cur = i

    print(res+4)

B. Chemistry

题目

给定长度为n的字符串s,判断是否可以通过删除任意k的字符后,使s成为回文字符串。(删除k个字符后的s,可以任意排序)

输入

首行测试样例数t,1\leq t\leq 10^{4}.

每组数据第一行输入n和k,由空格隔开,0\leq k\leq n\leq 10^{5}.

第二行为长度为n的字符串s

输出

输出判断结果“YES”或“NO”,不区分大小写。

解析

Codeforces Round #905(Div.3)_第2张图片

 rank的时候没有注意剩余字符可以任意排序,卡了一个多小时,这就是菜吧。回文字符串,从前往后和从后往前相同,故回文字符串中出现的字符,其数量为奇数的个数不能超过1。(只有长度为奇数的回文字符,才有能出现某个字符出现次数为奇数)。故只需统计s中字符出现奇数次的个数,判断其是否小于等于k+1即可。

代码


T = int(input().strip())

for t in range(T):
    n, k = map(int, input().strip().split())
    s = input().strip()
    l = [0] * 26
    for c in s:
        l[ord(c) - ord('a')] += 1

    cnt = 0
    for i in l:
        if i % 2:
            cnt += 1
    if cnt - k <= 1:
        print("YES")
    else:
        print("NO")

C. Raspberries

题目

给定长度为n的数字序列,每个数字k取值2\leq k\leq 5。每次操作,可选择序列中任一数字a,将其加1。

问,最少需要多少次操作可使\prod_{i=1}^{i=n}a_{i}能够被k整除。

输入

首行测试样例数t,其中1\leq t\leq 10^{4}

每组第一行输入n和k,空格隔开。2\leq n\leq 10^{5}, 2 \leq k \leq 5.

第二行长度为n的数字序列,一次用空格隔开

输出

t行最小操作次数

解析

Codeforces Round #905(Div.3)_第3张图片

k的取值只有2,3,4,5。当序列中任一一个数字能够被k整除时,序列的乘积便能够被k整除。故对于2,3,5素数,最优策略是将单个数字增加到能被k整除。

对4而言,有两种策略,一种同上。另一种,将两个数字增加到偶数,序列乘积便可被4整除。如果序列中偶数个数为cnt,则第二种策略的答案为max(0, 2-cnt)。从两种策略中选择最小值即可。

代码


T = int(input().strip())

for t in range(T):
    n, k = map(int, input().strip().split())
    b = k
    a = list(map(int, input().strip().split()))
    a.sort()

    res = 6
    even = 0
    for i in a:
        if i % 2 == 0:
            even += 1
        while i > k:
            k += b
        dis = k - i
        if dis < res:
            res = dis

    if b == 4:
        if n >= 2:
            res = min(res, max(0, 2-even))

    print(res)
    

第一次做CF,挑了个难度最低的,就做出来两个题,C还提交错了两次(扣了100)。总的来看div3前面题目的难度并不大,首次做全英文的题目会忽略掉一些关键条件。C的错误也是因为循环中变量命名习惯不好,慢慢纠正吧,看下次拿几分。

rank分多了400,成功从CF晋级为CF,o(╥﹏╥)o。

Codeforces Round #905(Div.3)_第4张图片

(另,解析里图片部分为出题人解答) 

你可能感兴趣的:(算法笔记,算法)