题目大意:有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;
}