3301.高度互不相同的最大塔高和
难度:中等
问题描述:
给你一个数组maximumHeight,其中maximumHeight[i]表示第i座塔可以达到的最大高度。
你的任务是给每一座塔分别设置一个高度,使得:
第i座塔的高度是一个正整数,且不超过maximumHeight[i]。
所有塔的高度互不相同。
请你返回设置完所有塔的高度后,可以达到的最大总高度。如果没有合法的设置,返回-1。
示例1:
输入:maximumHeight=[2,3,4,3]
输出:10
解释:
我们可以将塔的高度设置为:[1,2,4,3]。
示例2:
输入:maximumHeight=[15,10]
输出:25
解释:
我们可以将塔的高度设置为:[15,10]。
示例3:
输入:maximumHeight=[2,2,1]
输出:-1
解释:
无法设置塔的高度为正整数且高度互不相同。
提示:
1<=maximumHeight.length<=105
1<=maximumHeight[i]<=109
问题分析:
根据题目的描述,maximumHeight数组中的元素是每一座塔可以达到的最大高度,而要让你给每一座塔设置一个高度,以获得最大总高度。这是一个分配策略的问题,要让总高度最大,那么就尽量给每一座塔分配一个尽可能大的高度。根据题目的分配原则,可以采用以下的分配策略:
- 先找到maximumHeight数组中所有塔中可能达到的最大高度的最大值,然后分配给这座塔。
- 将已经分配了高度的塔从maximumHeight中去除。如果有最大高度相同的塔,为了保证所有塔高互不相同,在处理第二座可能达到的最大高度相同的塔时,其最大高度只能取其可能达到的最大高度减1。
- 重复1、2步操作,直到所有的塔都分配了最大高度为止。
- 将所有分配了的最大塔高和输出,即是问题的解答。
程序如下:
python
#输入原始数据
maximumHeight=eval(input('pls input maximumHeight='))
#列表a用于保存每次设置的最大塔高
a=[]
#cn为当前已经使用的最大塔高
cn=max(maximumHeight)
a.append(cn)
maximumHeight.pop(maximumHeight.index(cn))
while len(maximumHeight)>0:
m=max(maximumHeight)
if m<cn:
a.append(m)
maximumHeight.pop(maximumHeight.index(m))
cn=m
else:
a.append(m-1)
maximumHeight.pop(maximumHeight.index(m))
cn=m-1
#因为所有设置的塔高都为正整数,所以如果a中的最小值小于等于0,则设置不合格,输出-1,否则输出a中设置的最大塔高和
if min(a)<=0:
print(-1)
else:
print(sum(a))
运行实例一
pls input maximumHeight=[2,3,4,2]
10
运行实例二
pls input maximumHeight=[3,4,7,4,6,5]
27
运行实例三
pls input maximumHeight=[2,2,1]
-1
感悟:
巧妙的算法使问题的解决丝丝入扣,让你体会那一种逻辑的严谨,思维的神奇。学习算法能培养良好的逻辑思维习惯。