数组变为非减数组的最小操作数(python)

本文讲述了如何解决一道编程题,该题要求计算将一个数组变为非减数组所需的最少加一操作次数,每次操作可以对数组中若干项加一(对模m取值)。文中给出了思路,并讨论了优化方法,但未涉及所有题目。

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

 

第三题 迷宫,没做 据说最小生成树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值