本文主要是介绍Codeforces Round #905(Div.3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
A. Morning
题目
给定4位数字码,每位数字取值0-9。排列顺序如下:
初始光标指向1,每次可执行其中一个操作
1、输出光标所指数字
2、移动光标到相邻位置上。如3可移动到2或4,其中1只能移动到2,0只能移动到9。
问,需要进行多少次操作,能够得到给定的4位数字码。
输入
第一行为测试样例数t,取值范围
接下来t行,每行包含一个4位数字码
输出
输出t行,每行位得到此数字码需要的操作次数。
解析
依次遍历4位数字,记录光标移动到当前数字的移动次数,累加即为结果。因为输出数字也是一次操作,故最后需要加上4。
代码
T = int(input().strip())for t in range(T):n = input().strip()cur = 1res = 0for i in n:i = int(i)if i == 0:i = 10res = res + abs(i - cur)cur = iprint(res+4)
B. Chemistry
题目
给定长度为n的字符串s,判断是否可以通过删除任意k的字符后,使s成为回文字符串。(删除k个字符后的s,可以任意排序)
输入
首行测试样例数t,.
每组数据第一行输入n和k,由空格隔开,.
第二行为长度为n的字符串s
输出
输出判断结果“YES”或“NO”,不区分大小写。
解析
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] * 26for c in s:l[ord(c) - ord('a')] += 1cnt = 0for i in l:if i % 2:cnt += 1if cnt - k <= 1:print("YES")else:print("NO")
C. Raspberries
题目
给定长度为n的数字序列,每个数字k取值。每次操作,可选择序列中任一数字a,将其加1。
问,最少需要多少次操作可使能够被k整除。
输入
首行测试样例数t,其中
每组第一行输入n和k,空格隔开。.
第二行长度为n的数字序列,一次用空格隔开
输出
t行最小操作次数
解析
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 = ka = list(map(int, input().strip().split()))a.sort()res = 6even = 0for i in a:if i % 2 == 0:even += 1while i > k:k += bdis = k - iif dis < res:res = disif 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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!