要把数组划分成 k 个非空子序列(不必连续),最小化各子序列均价之和。
关键观察:在最优划分中,应有 k−1 个子序列只含一个元素,且这 k−1 个数是数组中最小的 k−1 个数;剩下 n−k+1 个数全部放进同一个子序列。
把一个较大的数单独拿出来,会把这个数完整地加进均价之和;把它并入较大的那一组则只按 1/m 的比例贡献。因此应把最小的 k−1 个数单独取出。
算法:将数组升序排序,令前 k−1 个数各自作为单元素子序列,剩余元素求算术平均,再把两者相加。
给定长度为 n 的数组 a1,a2,…,an,需要把它划分成恰好 k 个非空子序列,每个元素属于且仅属于一个子序列。子序列不必连续。
一个子序列的均价定义为该子序列所有元素之和除以元素个数。请找到一种划分,使得这 k 个子序列的均价之和最小,并输出该最小值。
结果保留恰好 5 位小数。
约束条件:
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.