Xtreme 10.0 - Dog Walking

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值