题目链接: 点击打开链接
题目大意: n个巴士司机,有n条白天线路和n条夜晚线路。给每个司机分配一条白天线路和一条夜晚线路。如果线路总时间超过时间上限d,那么每超过1小时就要付加班费r元。没超过就不用付。如何分配线路可以使加班费最少?
思路: 贪心
分析:
1. 首先把白天线路按时间从大到小排列。
2. 对于耗时最长的线路d1,应该分配耗时最短的夜间线路n1。因为:
a d1+n1超时:如果把n1和另外一条白天线路d2组合,也许不会超时,但相对地d1就会和另一条夜间线路n2匹配,超时更多。这种情况下总超时量是增加的,通过简单计算便知。
b d1+n1没超时: 如果把n1和另外一条白天线路d2组合,更加不会超时,浪费资源。因此d1和n1组合最佳。
3. 所以把夜间线路按时间从小到大排序,线路组合就出来了。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100 + 10;
int n, d, r;
int day[maxn], night[maxn];
bool comp(int a, int b)
{
return a > b;
}
int main()
{
while (scanf("%d %d %d", &n, &d, &r) == 3
&& n != 0 && d != 0 && r != 0)
{
for (int i = 0; i < n; ++i)
scanf("%d", &day[i]);
sort(day, day+n, comp);
for (int i = 0; i < n; ++i)
scanf("%d", &night[i]);
sort(night, night+n);
int ans = 0;
for (int i = 0; i < n; ++i)
ans += max(0, day[i] + night[i] - d);
printf("%d\n", ans * r);
}
return 0;
}