[解题报告] CSDN竞赛第24期
CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/38
这次写完第一道题时遇到一个奇怪的情况:一直在 运行中,然后发现每道题输入做任意代码都出现一直运行中。
跟小助手沟通后退出重新打开就可以运行了,但总耗时统计了之前花费的时间。
希望系统可以稳定一些吧,尽量不浪费时间,不影响体验和心情。
1. 计数问题
题目
试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9) 共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
输入描述:
2个整数 n,x , 之间用一个空格隔开。
输出描述:
1 个整数,表示 x 出现的次数。
输入样例:
11 1
输出样例:
4
解题报告
模拟,遍历 1 到 n 并解析每一位数,统计即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n, x):
s = 0
for i in range(1, n + 1):
m = i
while m:
if m % 10 == x:
s += 1
m = m // 10
return s
if __name__ == "__main__":
n, x = [int(item) for item in input().strip().split()]
sol = Solution()
result = sol.solution(n, x)
print(result)
2. 小艺的英文名
题目
小艺酱想给自己起一个英文名字。 小艺酱想要装的自己学识渊博。 所以她想要自己英文名字必须满足: 1.只有字母表中前k个小写字母。 2.必须是回文串。 3.前k个小写字母每个字母至少出现一次。 小艺酱已经自己完成了部分空余的字母部分用’?’代替。 请你帮她完成她的英文名字。
输入描述:
第一行输入一个整数k。(1<=k<=26) 第二行输入小艺酱的英文名字name。(1<=strlen(name)<=1000)
输出描述:
如果小艺的名字不存在输出“QAQ”, 如果存在多组解,输出字典序最小的一个解。
输入样例:
2
a??a
输出样例:
abba
解题报告
模拟,统计前 k 个小写字母中未出现的字母集合,倒序准备好
从中间向两端处理以保证字典序最小,设当前位置为 i,长度为 n,则对称位置为 n - i - 1
若位置 i 不为 ?,则
若位置 n - i - 1 不为 ? 且不相等则 QAQ,若为 ? 则位置 n - i - 1 填入 name[i]
若位置 i 为 ?,则
若位置 n - i - 1 不为 ? 则位置 i 填入 name[n - i - 1],否则填入集合中的字母,若集合中的字母都用完了,填 a 即可
最后判断候选集合是否用完,若没用完则 QAQ,否则输出填好的字符串
class Solution:
def __init__(self) -> None:
pass
def solution(self, k, name):
n = len(name)
m = (n - 1) // 2
ans = [name[i] for i in range(n)]
v = set(name)
a = []
for i in range(k - 1, -1, -1):
x = chr(ord('a') + i)
if x not in v:
a.append(x)
s = 0
for i in range(m, -1, -1):
if ans[i] != '?':
if ans[n - i - 1] != '?' and ans[i] != ans[n - i - 1]:
return 'QAQ'
if ans[n - i - 1] == '?':
ans[n - i - 1] = ans[i]
continue
if ans[n - i - 1] != '?':
ans[i] = ans[n - i - 1]
continue
if s >= len(a):
ans[i] = ans[n - i - 1] = 'a'
continue
ans[i] = ans[n - i - 1] = a[s]
s += 1
if s < len(a):
return 'QAQ'
return ''.join(ans)
if __name__ == "__main__":
k = int(input().strip())
name = input().strip()
sol = Solution()
result = sol.solution(k, name)
print(result)
3. 蛇形矩阵
题目
给你一个整数n,输出n∗n的蛇形矩阵。
输入描述:
输入一行,包含一个整数n
输出描述:
输出n行,每行包含n个正整数,通过空格分隔。
输入样例:
4
输出样例:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
解题报告
模拟,按对角线填入数字即可
class Solution:
def __init__(self) -> None:
pass
def solution(self, n):
s = 1
m = 1
a = [[0 for j in range(n)] for i in range(n)]
while s <= n * n:
i = m - 1
j = 0
while i >= 0 and j < m:
if i < n and j < n:
a[i][j] = s
s += 1
i -= 1
j += 1
m += 1
i = 0
j = m - 1
while i < m and j >= 0:
if i < n and j < n:
a[i][j] = s
s += 1
i += 1
j -= 1
m += 1
return [' '.join(map(str, a[i])) for i in range(n)]
if __name__ == "__main__":
n = int(input().strip())
sol = Solution()
result = sol.solution(n)
print('\n'.join(result))
4. 放货物
题目
小明是一名快递员,他现在手上一共有N个快件需要运送。但是货车有限,所以我们希望用最少的货车来进行工作。现在已知,一辆车的限定额度为最多放置K件货物。此外,小明很不喜欢13这个数字,所以他不希望任何一辆货车中的货物数量为13。 现在小明想要知道,最少使用多少辆货车能够将这N个快件都放置到货车上。
输入描述:
题目包含多组输入,每一组输入一行两个数,分别表示N 和 K 1<=N<=1000 1<=K<=1000
输出描述:
输出一行一个数字,表示最优结果。
输入样例:
13 13
5 2
输出样例:
2
3
解题报告
模拟,货车尽可能少时需要将货车尽可能装满
若 k < 13,答案为 n / k + int(n % k > 0)
若 k = 13,由于不能装 13 个快件,故只能每辆车装 12 个,答案为 n / 12 + int(n % 12 > 0)
若 k > 13,则装完 n / k 辆车后需要判断是否还剩下快件且快件数是否为 13,若为 13 且不能跟前一辆车匀(即 k == 14),答案为 n / k + int(n % k > 0) + int(k == 14 and n % k == 13)
class Solution:
def __init__(self) -> None:
pass
def solution(self, arr_temp):
ans = []
for arr in arr_temp:
if len(arr) < 2:
continue
n, k = arr
s = 0
if k < 13:
s = n // k + int(n % k > 0)
elif k == 13:
s = n // 12 + int(n % 12 > 0)
else:
s = n // k + int(n % k > 0) + int(k == 14 and n % k == 13)
ans.append(str(s))
return ans
if __name__ == "__main__":
sol = Solution()
data = []
while True:
try:
arr_temp = [int(item) for item in input().strip().split()]
data.append(arr_temp)
except:
break
result = sol.solution(data)
print("\n".join(result))