开发者社区> 问答> 正文

遇到一个求差值总和问题,求解答。

在一个课堂上,有n个学生(1<=n<=3e5),每个学生都有他们自己的学分ai(1<=ai<=1e9,ai<=ai-1),现在老师想将他们分为 m个小组 (1<=m<=n),为了方便交流,所有的小组都是由相邻的学生组成 (abc 相邻 , 不存在 ac 一个小组 b 在另一个小组的情况 ),现在老师想让每个小组的学分差值尽量小 ( 最大值减去最小值 ),请你帮助老师来分一下组,输出最后的每个小组的最小的差值的总和。 第一行和第二行输入两个数n、m表示有n个学生要分成m个小组,再输入n个数,表示每个学生的学分。 输出一个数字,表示最后分出的 m 个小组的最小的差值的总和。

展开
收起
游客4skzfvnrxrzbi 2021-12-23 16:38:35 508 0
1 条回答
写回答
取消 提交回答
  • 因为题目中说了 ai 是一个非递减的数列,所以我们可以推导出一个式子。 比如我们要将一个数组分成 3 组,那么可以假设为,[a1,ai],[ai+1,aj],[aj+1,an] 这三组,然后我们所要求的值就是 (ai-a1)+(aj-ai+1)+(an-aj+1) . 那么就可以推导出 an -a1+aj-aj+1-ai-ai+1,所以就是an- a1 减去最大的 m-1 个相邻的差值,那么 ai-ai+1 这个显然是差分的性质,所以我们对于原数列求一个差分数组出来,然后对差分数组进行排序,贪心的去减去前m-1个最大的就好了。 输入:5 3 [1,3,5,7,9] 输出:4

    2021-12-23 18:31:09
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载