版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1.输入:
4 7 #n,m
3 4 5 0 #A= {a_i|i=1,...,n}
输出:
4
每次可以对数组A中的任意数做如下操作:
,
求最终使数组变成非递减数组至少需要做多少次上面的操作。
【分析】这道题着实需要技巧,首先题目要求是把数组中的数,经过任意次加1取模操作之后,变成非递减的数组。
由此,我们可以考虑先变换数组成我们最终需要变成的那个非递减数组。
- A=[7, 3, 4, 0, 5, 1, 2, 2]
- 变换之后的非递减数列为:A_=[0, 0, 0, 0, 1, 1, 2, 2]
然后对相应的变换的数,就是A[i]>A_[i]的数:比如7→0,3→0等,计算它们需要执行的操作次数,取它们的最大。(对A[i]=A_[i]的数不需要计算执行操作的次数。)
import copy
def getANonDecreasing(A,n):
l,r=1,1
while r<n:
if A[r]<A[r-1]:
l=r-1
while l>=0 and A[r]<A[l]:
A[l]=A[r]
l-=1
r+=1
return A
def operate(n1,n2,m,freq):
while (n1+1)%m!=n2:
freq+=1
n1+=1
freq+=1
return freq
A=[7,3,4,0,5,1,2,2]
A=[3,4,5,6,0,1,0]
A=[3,4,5,6,0,0,2]
A=[0,0,1,1,2,2]
n,m=len(A),7
A_=getANonDecreasing(copy.deepcopy(A),n)
res=0
for i in range(n):
if A[i]>A_[i]:
res=max(res,operate(A[i],A_[i],m,0))
print(res)
其他输入示例
5 7
0 3 6 2 5
2.输入:
5 #接下来有n个任务,
2 3 5 #有2个前置任务分别为任务3,5;也就是说这第1个任务完成的前提是任务3,5完成
1 4 #第2个任务有1个前置任务为任务4
2 2 5
0
1 4
输出:
5 0 0 0 0 #输出第i天应该做的任务数量
【分析】利用追溯法。
res=[0 for i in range(N)]
for i in range(N):
ans=[i+1]
ans=solution(S,N,i,ans)
Max_ans=0 if not ans else max(ans)
res[i]=max(res[i-1],Max_ans)
for i in range(N-1,0,-1):
res[i]=res[i]-res[i-1]
res
def solution(S,N,i,ans):
tmp=S[i]
for k in range(tmp[0]):
if tmp[k+1] not in ans:
ans.extend([tmp[k+1]])
for j in tmp[1:]:
ans=solution(S,N,j-1,ans)
return ans
其他输入示例:
5
1 3
1 4
1 2
0
1 4