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 = 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,.
每组数据第一行输入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] * 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取值。每次操作,可选择序列中任一数字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 = 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。
(另,解析里图片部分为出题人解答)