[解题报告] CSDN竞赛第24期
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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))