这道题比较简单,主要是要考虑所有情况,之后进行判断就可以了。
题目要求是方便管理学生,能力强的和能力弱的一组就方便管理,因此需要找到学生能力的差的最大值,所以首先对数组进行排序(直接用sort很方便),排序后的数组的最后一项减去第一项就是最好管理的组的管理方便度。本题的要点在于将学生分成几组。以5名学生为例,学生的能力分别是2,6,7,9,10,分成一组,直接就是10-2,分成两组就需要(10-2)+(9-6),如果分成三组,则有人单独一组,该组的管理方便度为零,结果为(10-2)+(9-6)+0,如果分成四组,则有3人单独一组,剩下的一组一定要包含能力最强的和能力最弱的,结果是(10-2)+0+0+0,如果分成5组,则每组的管理方便度都为零,结果就是零。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
int a[100000];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
int nmax = 0;
int x = 0, y = n - 1;
while (k--)//要分成几组就循环几次
{
if (y - x == k)//每一次都判断剩下的人数和组数
{ //如果剩下的人数等于组数,则接下来每个人都是自己一组,管理方便度为0,直接跳出循环
break;
}
nmax += a[y] - a[x];
x++;
y--;
}
cout << nmax;
}
至于为什么不考虑三个及以上的学生为一组的情况,因为没必要,不管几个人一组,其管理方便度都是看能力最强的人和能力最弱的人。


京公网安备 11010502036488号