UVa 11389 (贪心) The Bus Driver Problem

题意:

有司机,下午路线,晚上路线各n个。给每个司机恰好分配一个下午路线和晚上路线。

给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r。

问如何分配路线才能使加班费最少。

分析:

感觉上是要先排序,然后时间最长的路线配另一个时间最短的路线。

这里就严格证明一下这样贪心的正确性。

以两条路线为例,其他情况都是类似的:

不妨假设:A1≥A2,B1≤B2,水平线代表d

情况一:

如图,司机一要付加班费,司机二不用,如果我们将B1、B2交换:

因为B1≤B2,所以付给司机一的加班费不会更少,而司机二的开车时间不会增加,所以也不用付加班费。

因此,交换以后总加班费不会减少。

情况二:

两位司机都要付加班费,则超出时间为(A1 + B1 - d) + (A2 + B2 - d)

如果交换B1、B2:

  • 如果两位司机还是超出正常工作时间,那么总的加班费用不变
  • 如果交换后司机一加班,司机二不加班,则超出时间为(A1 + B2 - d)。用这个减去原来的时间:(A1 + B2 - d) - (A1 + B1 - d) - (A2 + B2 - d) = d - (B1 + A2),因为此时司机二不加班,所以原式≥0,所以总超出时间不会减少

情况三:

司机一不付加班费,司机二要付。此时加班时长为(A2 + B2 - d)

如果交换B1、B2:

由B1≤B2,A1≥A2,所以B2加到A1上时,司机一一定会加班,司机二一定不会加班,此时加班时长为(A1 + B2 - d),减去原来的时间为(A1 + B2 - d) - (A2 + B2 - d) = (A1 - A2) ≥ 0

所以总加班时间不会减少。

好了,所有的情况应该都分析完了。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 const int maxn = 100 + 10;
 6 int a[maxn], b[maxn];
 7
 8 int cmp(const int& a, const int& b)
 9 {
10     return a > b;
11 }
12
13 int main()
14 {
15     freopen("11386in.txt", "r", stdin);
16     int n, d, r;
17     while(scanf("%d%d%d", &n, &d, &r) == 3 && n)
18     {
19         for(int i = 0; i < n; ++i) scanf("%d", &a[i]);
20         for(int i = 0; i < n; ++i) scanf("%d", &b[i]);
21         sort(a, a + n);
22         sort(b, b + n, cmp);
23
24         int ans = 0;
25         for(int i = 0; i < n; ++i)
26             ans += max(a[i] + b[i] - d, 0) * r;
27
28         printf("%d\n", ans);
29     }
30
31     return 0;
32 }

代码君

时间: 2024-10-10 12:11:17

UVa 11389 (贪心) The Bus Driver Problem的相关文章

UVA11389-The Bus Driver Problem

题目链接 题意:n个司机,n个下午路线和n个夜间的行驶时间.每个司机恰好分配到一个下午路线和一个夜间路线.司机行驶如果超过规定的行驶总时间,每个单位时间要多付给司机r元,求最小要给所有司机的加班费. 思路:贪心,将两个时间段的行驶时间排序,然后依次取最大和最小相加减去规定时间.那么超过的时间将最小,加班费也会最小. #include <iostream> #include <cstdio> #include <cstring> #include <algorith

UVA 11389 The Bus Driver Problem 贪心水题

题目链接:UVA - 11389 题意描述:有n个司机,n个早班路线和n个晚班路线,给每个司机安排一个早班路线和一个晚班路线,使得每个早班路线和晚班路线只属于一个司机.如果一个司机早班和晚班总的驾驶时间超过d,那么超出的时间按每小时r元付给司机.求最小的费用. 算法分析:一枚贪心的小水题.对早班路线的时间按照从大到小排序,对晚班路线的时间按照从小到大排序,然后就可以了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cs

General Problem Solving Techniques [Intermediate-1]~G - The Bus Driver Problem

In a city there are n bus drivers. Also there are n morning bus routes and n afternoon bus routes withvarious lengths. Each driver is assigned one morning route and one evening route. For any driver, ifhis total route length for a day exceeds d, he h

UVa 11389 - The Bus Driver Problem

题目:有n个上午的任务和下午的任务,分配给司机,如果工作总时间超过d,超过的部分要给加班费: 现在让你安排任务,问最小的加班分花费. 分析:贪心.将两个任务分别按递增和递减序排序,每个对应边号的一组即可. 设序列中的两组配对的元素为m1,a1,m2,a2 且 m1≤m2,a1≤a2: 则配对方式<m1,a2>,<m2,a1>优于<m1,a1>,<m2,a2>(浪费的可能更少). 说明:(⊙_⊙). #include <algorithm> #in

【策略】UVa 11389 - The Bus Driver Problem

题意: 有司机,下午路线,晚上路线各n个.给每个司机恰好分配一个下午路线和晚上路线.给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r.问如何分配路线才能使加班费最少. 虽然代码看起来很水.但一直不理解为什么,找到这位大神的解释与大家参考.http://www.cnblogs.com/AOQNRMGYXLMV/p/4122236.html 不妨假设:A1≥A2,B1≤B2,水平线代表d 情况一: 如图,司机一要付加班费,司机二不用,如果我们将B1.B2交换: 因为B1≤B2,所以

The Bus Driver Problem

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2384 题目大意: n个司机,设定每位司机上午下午各有一条行驶路线,现给出n条上午行驶路线时长和n条下午行驶路线时长,规定的工作时长为d小时,如果司机工作时长超过d小时,则超出的时间按每小时r塔卡(孟加拉国货币单位)计算加班费用,问:分配行驶路线后老板支付的加班费用最少为多少? 题

UVA 11389

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 

UVA 100 The 3*n+1 problem

  UVA 100 The 3*n+1 problem. 解题思路:对给定的边界m,n(m<n&&0<m,n<1 000 000);求X(m-1<X<n+1)进过操作至1的最大步数. 对m到n依次计算,比较获得最大步数. 注意:1.输入格式. 本题利用  while(scanf("%d %d",&m,&n)!=EOF)                  {                 }       2.输出与题给出相同

01_传说中的车(Fabled Rooks UVa 11134 贪心问题)

问题来源:刘汝佳<算法竞赛入门经典--训练指南> P81: 问题描述:你的任务是在n*n(1<=n<=5000)的棋盘上放n辆车,使得任意两辆车不相互攻击,且第i辆车在一个给定的矩形R之内. 问题分析:1.题中最关键的一点是每辆车的x坐标和y坐标可以分开考虑(他们互不影响),不然会变得很复杂,则题目变成两次区间选点问题:使得每辆车在给定的范围内选一个点,任何两辆车不能选同一个点.  2.本题另外一个关键点是贪心法的选择,贪心方法:对所有点的区间,按右端点从小到大排序:每次在一个区间