1.将数组变成非递减数组的最少操作2.每日的任务数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_33598125/article/details/101228420

1.输入:

4 7  #n,m
3 4 5 0  #A= {a_i|i=1,...,n}

输出:

4

每次可以对数组A中的任意数做如下操作:
a i = m o d ( ( a i + 1 ) , m ) a_i=mod((a_i+1),m) ,
求最终使数组变成非递减数组至少需要做多少次上面的操作。
【分析】这道题着实需要技巧,首先题目要求是把数组中的数,经过任意次加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

猜你喜欢

转载自blog.csdn.net/qq_33598125/article/details/101228420