【在线编程产品介绍】
阿里云开发者社区在线编程:
免费刷题大神器,助你拿到好offer
周赛月赛不停歇,做题还能领奖品
大赛笔试全真题,常做常新有惊喜
点击链接开始产品体验:https://developer.aliyun.com/coding
本文为大家介绍的是“131.学习小组”的解法探究。先来看一下题目内容:
题目详情:
等级:中等
知识点:贪心
查看题目:学习小组
在一个课堂上,有n个学生(1<=n<=3e5),每个学生都有他们自己的学分ai(1<=ai<=1e9,ai<=ai-1),现在老师想将他们分为m个小组(1<=m<=n),为了方便交流,所有的小组都是由相邻的学生组成(abc相邻,不存在ac一个小组b在另一个小组的情况),现在老师想让每个小组的学分差值尽量小(最大值减去最小值),请你帮助老师来分一下组,输出最后的每个小组的最小的差值的总和。
第一行和第二行输入两个数n、m表示有n个学生要分成m个小组,再输入n个数,表示每个学生的学分。
输出一个数字,表示最后分出的m个小组的最小的差值的总和。
示例1
输入:
5
3
[1,3,5,7,9]
输出:
4
解题方法:
因为题目中说了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个最大的就好了。
看完之后是不是有了答题思路了呢,快来练练手吧:131.学习小组
在线编程周赛、月赛火热进行中,更有限时答题活动,定制卫衣、双肩背包、机械键盘等多重好礼等你来拿~每天都有好礼相送~点击了解周赛详情:在线编程3月份比赛正式开启!机械键盘等你拿!