II U C ONLINE C ON TEST 2 008 | |
Problem E: The Bus Driver Problem | |
Input: standard input Output: standard output | |
| |
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 | Output for Sample Input |
2 20 5 10 15 10 15 2 20 5 10 10 10 10 0 0 0 | 50 0 |
|
|
Problem setter: Mohammad Mahmudur Rahman |
题意:n个司机,n条下午路线和n条夜晚路线,给每个司机安排一条下午和夜晚路线,使得刚好每条路线都有一个司机,每个司机的总时间如果超过了d,则需给司机超出部分每小时r元,最优安排使得总支付费用最少。输入n d r 和2*n条线路的时间
思路:一看这么简单,还以为错的,结果真的这么简单。。
直接贪心,平均分配。一短一长的搭配
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#include <queue>
#include <set>
using namespace std;
//#define WIN
#ifdef WIN
typedef __int64 LL;
#define iform "%I64d"
#define oform "%I64d\n"
#else
typedef long long LL;
#define iform "%lld"
#define oform "%lld\n"
#endif
#define S64I(a) scanf(iform, &(a))
#define P64I(a) printf(oform, (a))
#define FOR(i, s, t) for(int (i)=(s); (i)<(t); (i)++)
const int INF = 0x3f3f3f3f;
const double eps = 10e-9;
const double PI = (4.0*atan(1.0));
const int maxn = 100 + 20;
int A[maxn];
int B[maxn];
int main() {
int n, d, r;
while(scanf("%d%d%d", &n, &d, &r) != EOF && !(!n && !d && !r)) {
for(int i=0; i<n; i++) scanf("%d", &A[i]);
for(int i=0; i<n; i++) scanf("%d", &B[i]);
sort(A, A+n);
sort(B, B+n);
int ans = 0;
for(int i=0; i<n; i++) {
int t = A[i] + B[n-i-1];
if(t > d) ans += (t-d) * r;
}
printf("%d\n", ans);
}
return 0;
}