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