第八次-UVA-11389-贪心

UVA-11389

题目大意:有n个司机,n条早上路线和n条下午路线,先在要给每个司机安排一条早上路线和一条下午路线,如果司机的工作时长超过d,则要按照每小时r元付加班费,问最少需支付多少加班费。

题解:思路是贪心,首先定义两个数组,分别用于存放早上路线的长度与下午路线的长度,然后早上路线时长的升序排放,下午的路线时长降序排,这样子早上的最小时长搭配下午的最大时长,已达到每个司机的超出时长值最小,从而使得加班费最小化

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 105
int a[maxn], b[maxn];//a数组为早上路线时长,b组为下午路线时长
int c[maxn];//c数组存放a[min]+b[max]
bool cmp(int a, int b)//从大到小排
{
	return a > b;
}
int main()
{
	int n, d, r;//n为行数,d为工作时长(超过加工资),r为每小时的加班费

	while (cin >> n >> d >> r)
	{
		if ((n == 0) && (d == 0) && (r == 0))break;
		for (int i = 0; i < n; i++)
		{
			cin >> a[i];
		}
		for (int i = 0; i < n; i++)
		{
			cin >> b[i];
		}
		sort(a, a + n);
		sort(b, b + n, cmp);
		for (int i = 0; i < n; i++)
		{
			c[i] = a[i] + b[i];
		}
		int sum = 0;//加班时长
		for (int i = 0; i < n; i++)
		{
			if (c[i] > d)
				sum += c[i] - d;
		}
		cout << sum * r << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43866317/article/details/86688544