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

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

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 ra
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值