Xtreme 10.0 - Dog Walking
题目:
https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/dog-walking
题意:
有K个人和N只狗狗,每只狗狗的重量分别为x[0], x[1], x[2], ..., x[N-1]。在带狗狗们出去散步前,需要把N只狗狗分给K个人照看,为了便于管理,每个人照看的狗狗们的重量应该尽可能接近。试求出一种分配方法,使得所有人所照看的狗狗的重量差的最大值之和达到最小,并输出该最小值。
输入:
第一行输入n,代表测试用例的数量
第二行输入N K,分别代表狗狗的数量和人的数量
接下来的K行输入x[i],分别代表第i只狗狗的重量
输出:
分组后,所有人分配的狗群的狗狗重量差的最大值之和。
测试用例:
输入:
2
4 2
3
5
1
1
5 4
30
40
20
41
50
输出:
2
1
解释:
对于第二组数据,将5只狗狗分成4组,将重量为20、30、51的三只狗狗放在3个组里,重量为40和41的狗狗放在第四个组里,则第一组最大重量差为20 - 20 = 0, 第二组最大重量差为30 - 30 = 0, 第三组最大重量差为51 - 51 = 0, 第四组最大重量差为41 - 40 = 1,因此总和加起来为1。
思路:
目标:要使得每组狗狗重量差的最大值达到最小,则需要将重量差较小的狗狗分配在同一组。
步骤:
1、将所有狗狗按重量从小到大排序,然后计算两两之间重量的差值,将得到的结果存放在一个长度为n - 1的数组dogsDiffer中。
2、对dogsDiffer数组排序,找出差值最大的K-2个数,其对应的K-1只狗狗分别的分配到K-1组中,剩余的狗狗全都分配到最后的一个组,此为分配方式。
3、最后一个组的最大重量差即为所求。
代码:
#include <iostream>
#include <array>
#include <algorithm>
using namespace std;
const long long arrSize = (long long)1e5;
array<long long, arrSize> dogs;
array<long long, arrSize> dogsDiffer;
void onecase() {
unsigned int K = 0, N = 0;
cin >> K >> N;
for (array<long long, arrSize>::size_type i = 0; i < K; i++) {
cin >> dogs[i];
}
sort(dogs.begin(), dogs.begin() + K);
for (array<long long, arrSize>::size_type i = 1; i < K; i++) {
dogsDiffer[i - 1] = dogs[i] - dogs[i - 1];
}
sort(dogsDiffer.begin(), dogsDiffer.begin() + K - 1);
long long sum = 0;
for (array<long long, arrSize>::size_type i = 0; i < K - N; i++) {
sum += dogsDiffer[i];
}
cout << sum << endl;
}
void dogWalking() {
int caseCount = 0;
cin >> caseCount;
while (caseCount) {
onecase();
}
}
int main() {
dogWalking();
return 0;
}