The Bus Driver Problem In a city there are n bus drivers. Also there are n morning bus routes & n afternoon bus routes with various lengths. Each driver is assigned one morning route & one evening route. For any driver, if his total route length for a day exceeds d, he has to be paid overtime for every hour after the first d hours at a flat r taka / hour. Your task is to assign one morning route & one evening route to each bus driver so that the total overtime amount that the authority has to pay is minimized. |
Input |
The first line of each test case has three integers n, d and r, as described above. In the second line, there are n space separated integers which are the lengths of the morning routes given in meters. Similarly the third line has n space separated integers denoting the evening route lengths. The lengths are positive integers less than or equal to 10000. The end of input is denoted by a case with three 0 s. |
Output |
For each test case, print the minimum possible overtime amount that the authority must pay. |
Constraints |
- 1 ≤ n ≤ 100 - 1 ≤ d ≤ 10000 - 1 ≤ r ≤ 5 |
sample input
2 20 5
10 15
10 15
2 20 5
10 10
10 10
0 0 0
sample outputs
50
0
题意: 给每位司机分配一个白天和晚上的行车路线, 每个路线时间给出, 并且如果司机工作时间为d,
超过时间d就算是加班工作, 每一小时就按照r工资计算, 现在要你安排使得最小的加班费用.
解题思路:
1. 问题很简单, 大小配即可.
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 105
int n, d, r;
int a[MAX], b[MAX];
bool cmp(int a, int b)
{
return a > b;
}
inline int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
// freopen("input.txt", "r", stdin);
int i;
while(scanf("%d %d %d", &n, &d, &r) != EOF)
{
if(n == 0 && d == 0 && r == 0) break;
for(i = 0; i < n; ++i)
scanf("%d", &a[i]);
for(i = 0; i < n; ++i)
scanf("%d", &b[i]);
sort(a, a+n);
sort(b, b+n, cmp);
int ans = 0;
for(i = 0; i < n; ++i)
ans += max(0, (a[i]+b[i]-d));
printf("%d\n", ans*r);
}
return 0;
}