Arthur最近搬到了新的别墅,别墅特别大,原先的桌子显得比较小,所以他决定换一张新的桌子。他买了一张特
别大的桌子,桌子是由很多条桌腿进行支撑的,可是回到家之后他发现桌子不稳,原来是桌子腿长度不太相同。他
想要自己把桌子修理好,所以他决定移除掉一些桌腿来让桌子变得平稳。桌子腿总共有n条腿,第i条腿长度为li,
Arthur移除第i桌腿要花费代价为di。假设k条腿桌子平稳的条件:超过一半桌腿能够达到桌腿长度的最大值。
例如:一条腿的桌子是平稳的,两条腿的桌子腿一样长时是平稳的。请你帮Arthur计算一下是桌子变平稳的
最小总代价。
输入:
第一行数据是一个整数:n (1≤n≤105),n表示桌腿总数。
第二行数据是n个整数:l1, l2, ..., ln (1≤li≤105),表示每条桌腿的长度。
第三行数据是n个整数:d1, d2, ..., dn (1≤di≤200),表示移除每条桌腿的代价。
输出:
输出让桌子变平稳的最小总代价
首先按照能量从小到大进行排序,执行以下几步:
1)总数为n,最长腿数为m
2)如果最长腿数过半,则退出;
3)不超过一半,若保留最长腿,则从排序的能量中选出(n-m-(m-1))个非最长腿对应的能量,求和;
4)若不保留最长腿,则去掉最长腿对应的l和d,执行1)、2)、3)。
代码如下:
n = int(input())
l = list(map(int, input().split(' ')))
d = list(map(int, input().split(' ')))
def min_energy(l, d, n):
max_ = max(l)
m = 0
d1 = []
l1 = []
d_max = []
for i in range(n):
if l[i] == max_:
m += 1
d_max.append(d[i])
else:
d1.append(d[i])
l1.append(l[i])
if m > n/2:
return 0
return min(sum(d1[:n-2*m+1]), sum(d_max)+min_energy(l1, d1, len(l1)))
def sort_by_d(val):
return val[1]
d_l = list(zip(l, d))
d_l.sort(key=sort_by_d)
d_ = [v[1] for v in d_l]
l_ = [v[0] for v in d_l]
print(min_energy(l_, d_, n))