题意:
有n个司机,n条下午路线和n条晚上路线,现在要给每个司机安排一条下午路线和一条晚上路线,如果司机的工作时间超过d,则要按照每小时r元增加加班费,问最少需支付多少加班费。
解析:
贪心,下午最大的搭配晚上最小的之和,它和d的差值的和,一定是最小的。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int N = 105;
int n, d, r;
int mon[N], eve[N];
bool cmp(int a, int b) {
return a > b;
}
int main() {
while(scanf("%d%d%d", &n, &d, &r) != EOF) {
if((n + d + r) == 0) break;
for(int i = 0; i < n; i++) {
scanf("%d", &mon[i]);
}
for(int i = 0; i < n; i++) {
scanf("%d", &eve[i]);
}
sort(mon, mon+n);
sort(eve, eve+n, cmp);
int ans = 0;
for(int i = 0; i < n; i++) {
int tmp = mon[i] + eve[i];
if(tmp > d)
ans += (tmp - d) * r;
}
printf("%d\n", ans);
}
return 0;
}