2020招行信用卡,6点半发现有八点截至的测评,7-9点又是笔试,果断滑跪,大概7点半才开始的笔试,编程瞬间没脑子了。。
第一题
输入:
第一行:n,m 数组长度,mod的值
第二行:原始数组(长度n,里面每一个小于m)
求多少次操作能产生不减的数组,一次操作可以对若干项各自+1(mod m)
例如:
输入
5 7
0 1 1 1 4
输出:0
输入
4 6
1 2 3 0
输出:3
思路:设A[i][j] 表示前i个元素以j结尾的非减数列需要的次数,那么首先计算新取的第i个数变为j需要的次数s,再考虑前面i-1个元素,如果前面的结尾小于等于j,那么只要取前面的最小次数p,即为满足当前非减的前部分次数,因为前后可以同时改变,只要max(p,s),如果前面的元素结尾大于j,那么考虑前面的结尾要先变成小于j的,回到之前一种情况,没必要考虑。
import sys
n,m = list(map(int, input().split()))
nlist = list(map(int, input().split()))
A = [[0 for _ in range(m)] for _ in range(n)]
for j in range(m):
A[0][j] = j - nlist[0] if j - nlist[0]>=0 else m - (nlist[0] - j)
for i in range(1,n):
for j in range(m):
Aj = j - nlist[i] if j - nlist[i]>=0 else m - (nlist[i] - j)
A[i][j] = max(Aj,min(A[i-1][:j+1]))
res = m
for j in range(m):
if A[-1][j]<res:
res = A[-1][j]
print(res)
又是一道考完做的,所以仅确定例题通过。
跟寝室大佬交流了一下,发现i的长度没必要,因为每次只可能用到i-1,省一维。
第二题递归超时,有n个任务,第i天需要完成第i个,有的任务有前置任务,需要一并完成,问每天完成多少。有人做出来的话求分享
例如输入:
3 (共三天)
1 2 (第一天一共1个前置任务,是2)
0 (第二题0个前置任务)
1 1(第三题共1个前置任务,为1)
输出:
2 0 1
第三题 迷宫,没做 据说最小生成树
本文讲述了如何解决一道编程题,该题要求计算将一个数组变为非减数组所需的最少加一操作次数,每次操作可以对数组中若干项加一(对模m取值)。文中给出了思路,并讨论了优化方法,但未涉及所有题目。
564

被折叠的 条评论
为什么被折叠?



