的士
2015-08-18 21:58
316 查看
题意
Bessie为农场上的其他奶牛提供的士服务。奶牛们在一条长为M(1<=M<=1,000,000,000)的栅栏的不同位置上。不幸的是,它们厌倦了它们现在所在的位置而想要去栅栏上其他的位置。Bessie必须把她每一个朋友从它们各自的起始地接上车然后送它们到目的地。但Bessie的车太小了,所以她每次只能运送一只奶牛。奶牛们上车下车是瞬间的事情。为了省油钱,Bessie想要使她的驾驶量最小。给出N只奶牛(1<=N<=100,000)每一只的起始地和目的地,计算Bessie最少需要的驾驶量。Bessie意识到她需要偶尔把牛放在某一个地方而不是把它送到目的地才能省油钱。
Bessie在栅栏最左端(位置0)开始工作,而且必须在最右端(位置M)结束她的工作。
分析
很明显,在过程中,我们不会把一个奶牛带到离它目的地更远的地方,若要在某个地方回头走,我们可以把奶牛放在当前位置。于是将原来的关键点排序后,每两个相邻的点构成了一条线段。对于一条线段,我们考虑路径要经过这条线段的路线。记A为起点在线段左端点及其以左的位置的路线数,B为起点在线段右端点及其以右的位置的路线数。我们是从左往右走。
1° A>BA > B ,我们就要经过这条线段(2∗A−1)(2 * A - 1)次,才能把之前放在线段左端点的奶牛运到线段右端点(并在从线段右端点回来的同时带上要来左端点的奶牛)
2° A≤BA \le B,我们要经过这条线段2∗B+12 *B+1次才能满足条件。
这样,我们能求出每条线段对答案的贡献,这样得出的答案一定是最优的。因为在局部你的做法是最优的,在全局你一定得出的是最优解。
#include <cstdio> #include <algorithm> #include <map> using namespace std; typedef long long LL; const int N = 1e5 + 10; int a[N * 2]; map<int,int> num; int nt,n,m; int pre[N * 2],suf[N * 2],e[N * 2]; int s [2]; int main() { scanf("%d%d",&n,&m); int tot = 0,last = 0; for (int i = 1;i <= n;i ++) { scanf("%d%d",&s[i][0],&s[i][1]); a[++ tot] = s[i][0]; a[++ tot] = s[i][1]; } sort(a + 1,a + 1 + tot); for (int i = 1;i <= tot;i ++) if (i == 1 || a[i] != a[i - 1]) { num[a[i]] = ++ nt; e[nt] = a[i]; } for (int i = 1;i <= n;i ++) { int x = num[s[i][0]],y = num[s[i][1]]; if (x < y) pre[x] ++,pre[y] --; else suf[x] ++,suf[y] --; } for (int i = 1;i <= nt;i ++) pre[i] += pre[i - 1]; for (int i = nt;i;i --) suf[i] += suf[i + 1]; LL ans = e[1] + m - e[nt]; for (int i = 1;i < nt;i ++) { int A = pre[i],B = suf[i + 1]; if (A > B) { ans += LL(2 * A - 1) * LL(e[i + 1] - e[i]); } else ans += LL(2 * B + 1) * LL(e[i + 1] - e[i]); } printf("%lld",ans); }
相关文章推荐
- 2015年8月18日工作日志--------赵鑫
- 2015 7 1 java核心技术 卷1 第6章 接口与内部类
- BZOJ 1698 [Usaco2007 Feb]Lilypad Pond 荷叶池塘 BFS+最短路
- 蓝牙4.0BLE cc2540 cc2541 ios OAD课程(空中固件升级)[原版的,多图]
- scala学习第一章 基础
- 二叉树后续遍历算法
- Android Button
- Objective-C(面向对象的三大特性)
- 转:js-sdk探索之微信网页分享
- Linux用户、用户组
- 常用DOS命令-telnet
- 深度学习:像人脑一样深层次地思考
- 8.18 volley使用https
- 费用流 hdu3376 Matrix Again
- RT-Thread finsh源码分析: finsh_error.h
- Android Api Demos登顶之路(三十六)Fragment-->ContextMenu
- Java生成随机验证码
- Apache服务器CPU利用率、Load值及Running值高导致WEB无法访问
- NFS服务搭建
- 02==C语言(数据类型,进制转换,三码)