UVA 11389
Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
Description
II U C ONLINE C ON TEST 2 008 |
|
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 |
|
|
|
题解:本题是解决实际问题,有n个上午的任务和下午的任务,分配给司机,如果工作总时间超过d,超过的部分要给加班费;
现在让你安排任务,问最小的加班分花费。
分析:贪心问题。将两个任务分别按递增和递减序排序,每个对应边号的一组即可。
设序列中的两组配对的元素为m1,a1,m2,a2 且 m1≤m2,a1≤a2;
则配对方式<m1,a2>,<m2,a1>优于<m1,a1>,<m2,a2>
代码如下:
#include<iostream> #include<algorithm> using namespace std; int a[105],b[105]; int main() { int i,x,y,z; while(cin>>x>>y>>z&&x&&y&&z) { int s=0; for(i=1; i<=x; i++) { cin>>a[i]; } for(int i=1; i<=x; i++) { cin>>b[i]; } sort(a,a+x); sort(b,b+x); for(i=1; i<=x; i++) { if(a[i]+b[x+1-i]>y) { s=(a[i]+b[x-i+1]-y)*z; s+=s; } } cout<<s<<endl; } return 0; }
咳咳,其实上面是错的。。虽然可以输出正确结果,但是提交不会AC。
以下是正确的代码,请注意改动的地方!!
#include<iostream> #include<algorithm> using namespace std; int a[105],b[105]; int main() { int i,j,k,x,y,z; while(cin>>x>>y>>z&&x&&y&&z) { int s=0; for(i=1; i<=x; i++) { cin>>a[i]; } for(int k=1; k<=x; k++) { cin>>b[k]; } sort(a,a+x); sort(b,b+x); for(int j=1; j<=x; j++) { if(a[j]+b[x+1-j]>y) { s=(a[j]+b[x-j+1]-y)*z; s+=s; } } cout<<s<<endl; } return 0; }
可以仔细想一想为什么会出现这样的情况