解决leetcode第3971题最大总价值

3971.最大总价值

难度:困难

问题描述:

给你两个整数数组value和decay,以及一个整数m。

valuei表示下标i的初始价值。

decayi表示每次选择下标i后,该下标的价值会减少的数值。

你可以多次选择任意下标。所有下标的总选择次数不得超过m。

如果重复选择下标i,第t次(从1开始计数)获得的价值为valuei-decayi*(t-1)。

返回你能够获得的最大总价值。由于答案可能很大,请返回其对109+7取模后的结果。

示例1:

输入:value=6,5,4,decay=2,1,1,m=4

输出:19

解释:

一种最优选择序列如下:

选择下标0,获得的价值为6。

选择下标1,获得的价值为5。

选择下标2,获得的价值为4。

再次选择下标0,获得的价值为6-2=4。

总价值为6+5+4+4=19。在至多4次选择中,没有其他选择序列能获得更高的总价值。

示例2:

输入:value=7,2,2,decay=3,2,1,m=2

输出:11

解释:

一种最优选择序列如下:

选择下标0,获得的价值为7。

再次选择下标0,获得的价值为7-3=4。

总价值为7+4=11。

示例3:

输入:value=4,3,decay=5,4,m=5

输出:7

解释:

一种最优选择序列如下:

选择下标0,获得的价值为4。

选择下标1,获得的价值为3。

总价值为4+3=7。

提示:

1<=value.length==decay.length<=10**5

1<=valuei,decayi<=10**9

1<=m<=10**9

问题分析:

为了获得最大总价值,那么每一次获得的价值都应该是最大值,其实就是要对value价值数组进行处理,如果下标第一次被选择,则获得的价值为valuei,如果下标已经已经被选择过,则获得的价值为valuei-decayi,对所有下标进行处理,然后选取获得价值最大的下标即可,为此设计函数choice_one_subscript(value,decay)实现这一功能,为了方便统计下标被选择的次数,把vlaue数组进行了重构,其数据格式为\[value\[0,被选择次数],value\[1,被选择次数],value\[2,被选择次数]......value\[n,被选择次数]],初始状态所有下标被选择次数都为0,函数返回数据包括:最大获得价值,被选择的下标以及下一次要处理的value数组。

程序如下:

python 复制代码
#挑选选择哪一个下标,并返回相应的价值,返回之后的value列表,注意value是改良过的列表,包括选择次数
def choice_one_subscript(value,decay):
    a=[]
    n=len(decay)
    for i in range(n):
        if value[i][1]==0:
            a.append([value[i][0],i])
        else:
            a.append([value[i][0]-decay[i],i])
    a.sort(key=lambda x:x[0])
    x=a[-1][0]
    y=a[-1][1]
    if value[y][1]!=0:
        value[y][0]=value[y][0]-decay[y]
    value[y][1] += 1
    return a[-1][0],a[-1][1],value

value=eval(input('pls input value='))
decay=eval(input('pls input decay='))
m=int(input('pls input m='))
n=len(value)
t=[0]*n
value=list(zip(value,t))
value=list(list(i) for i in value)
print(value)
a=[]
for i in range(m):
    b,c,d=choice_one_subscript(value,decay)
    if b>0:
        a.append(b)
        value = d
        print(f'选取下标为{c},获得价值为{b}')
    else:
        break
    print(d)
print('获得的最大总价值为',sum(a)%(10**9+7))

运行实例一

pls input value=6,5,4

pls input decay=2,1,1

pls input m=5

\[6, 0\], \[5, 0\], \[4, 0\]

选取下标为0,获得价值为6

\[6, 1\], \[5, 0\], \[4, 0\]

选取下标为1,获得价值为5

\[6, 1\], \[5, 1\], \[4, 0\]

选取下标为2,获得价值为4

\[6, 1\], \[5, 1\], \[4, 1\]

选取下标为1,获得价值为4

\[6, 1\], \[4, 2\], \[4, 1\]

选取下标为0,获得价值为4

\[4, 2\], \[4, 2\], \[4, 1\]

获得的最大总价值为 23

运行实例二

pls input value=7,2,2

pls input decay=2,1,2

pls input m=3

\[7, 0\], \[2, 0\], \[2, 0\]

选取下标为0,获得价值为7

\[7, 1\], \[2, 0\], \[2, 0\]

选取下标为0,获得价值为5

\[5, 2\], \[2, 0\], \[2, 0\]

选取下标为0,获得价值为3

\[3, 3\], \[2, 0\], \[2, 0\]

获得的最大总价值为 15