HDU 5699 货物运输
2017-08-10 10:29
176 查看
货物运输
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 482 Accepted Submission(s): 210
Problem Description
公元2222年,l国发生了一场战争。
小Y负责领导工人运输物资。
其中有m种物资的运输方案,每种运输方案形如li,ri。表示存在一种货物从li运到ri。
这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i
100fd
+1号或者从i+1号走到i号需要耗费1点时间。
由于高科技的存在,小Y想到了一种节省时间的好方案。在X号城市与Y号城市之间设立传送站,只要这么做,在X号城市走到Y号城市不需要耗费时间,同样的,从Y号城市走到X号城市也不需要耗费时间。
但是为了防止混乱,只能设立这么一条传送站。
现在这些运输方案同时进行,小Y想让最后到达目的地的运输方案时间最短。
在样例中,存在两条运输方案,分别是1号城市到3号与2号到4号,那么我们在2号城市与3号城市建立传送站,这样运输方案时间最长的只需要1点时间就可以了。
Input
多组测试数据
第一行两个整数n,m(1≤n,m≤1000000)。
接下来m行,每行两个整数li,ri(1≤li,ri≤n)。(若li=ri,则不需要耗费任何时间)
Output
一个数表示答案。
Sample Input
5 2
1 3
2 4
Sample Output
1
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5699
题意:见题目。
解题思路:昨天在学校内部举行了一场单人赛,(打的很惨),比赛的时候都没看这道题目,今早上队友跟我说是二分的题我才看题目,看完题目的时候我一直在纠结放置转换器的区间(被样例解释给坑了,也是自己太傻了),觉得得用搜索,好像跟二分没什么关系,但是一直没想出个所以然,后来再仔细看题的时候才知道只要输出用时最少是多少就行,放置转换器的区间作为判断的条件就行。所以很快就想到二分,用时最短为0,最长为城市的个数n,所以将它们作为二分的左右区间进行二分就好,当前的mid如果可以得到解的话就必须满足:(|x-l[i]|+|y-r[i]|<=mid)(此时x和y为放置转换器的区间,l[i]和r[i]为距离大于mid的区间,因为小于mid的区间可以不用考虑),去掉绝对值可以得到四个不等式:
(x+y)<=(l[i]+r[i]-time)
(x+y)>=(l[i]+r[i]+time)
(y-x)<=(r[i]-l[i]-time)
(y-x)>=(r[i]-l[i]+time)
即放置转换器区间的范围,很明显小于等于(x+y)的最大值(ma1)要小于等于大于等于(x+y)的最小值(mi1)才满足要求,同理(y-x)也是(ma2),(mi2),但要考虑一个特殊情况,就是(x+y)和(y-x)的值唯一确定时,也就是ma1=mi1 且 ma2=mi2时,此时不等式方程转变为等式方程,2*x=ma1+ma2,所以为了得到整数解(ma1+ma2)不能为奇数。
AC代码:
#include<cstdio> #include<algorithm> using namespace std; const int MAXM = 1000000 + 10; const int INF = 1000000 + 7; int n,m; int left[MAXM];//运输的左起点 int right[MAXM];//运输的右终点 bool ok(int time) { int ma1=-INF,mi1=INF; int ma2=-INF,mi2=INF; for(int i=0;i<m;i++) { if(right[i]-left[i]>time)//当运输时间大于x时判断 { //(x,y)为放置转换器的两地 ma1=max(ma1,left[i]+right[i]-x);//(x+y)<=(l+r-time) 此时time为solve函数中传入的mid mi1=min(mi1,left[i]+right[i]+x);//(x+y)>=(l+r+time) ma2=max(ma2,right[i]-left[i]-x);//(y-x)<=(r-l-time) mi2=min(mi2,right[i]-left[i]+x);//(y-x)>=(r-l+time) } } if(ma1<=mi1 && ma2<=mi2)//当小于等于(x+y)的最大值小于等于大于等于(x+y)的最小值才满足要求 { if(ma1==mi1 && ma2==mi2) /*当x+y的值和x-y的值唯一确定时,ma1=mi1 && ma2=mi2, 那么此时不等式方程转变为等式方程 2*x=ma1+ma2 如果ma1+ma2为奇数, 那么此时x没有整数解,及当前的mid不能得到满足要求的(x,y)*/ { if((ma1+ma2)&1) return false; } return true; } return false; } void solve() { int lb,ub,mid; int ans; lb=0,ub=n; while(lb<=ub)//二分求解 { mid=(lb+ub)/2; if(ok(mid))//当(x,y)存在时,那么就缩小查找范围,查找更小的满足要求的时间 { ans=mid; ub=mid-1; } else lb=mid+1; } printf("%d\n",ans); } int main(void) { while(scanf("%d%d",&n,&m)==2) { for(int i=0;i<m;i++) { scanf("%d%d",&left[i],&right[i]); if(left[i]>right[i]) { swap(left[i],right[i]);//如果输入的是大的坐标运输到小的坐标时进行交换 } } solve(); } return 0; }
相关文章推荐
- HDU 5699 货物运输 (二分 + 不等式判断 好题)
- Hdu 5699 货物运输
- hdu 5699 货物运输 (啥)
- HDU 5699 货物运输 ( 二分 + 不等式判断 )
- HDU 5699 货物运输 二分
- HDU 5699 货物运输
- HDU 5699 货物运输 二分判定
- HDU 5699 货物运输
- 2016暑期集训12C L国货物运输 HDU 5699 货物运输
- 【HDOJ】【百度之星】5699 货物运输
- 中石油5909: 货物运输(LCA树上两点最近公共祖先) SDWC 2018 day5
- 【二分+曼哈顿距离】51Nod 1671 货物运输
- [思维题]51 Nod 1671——货物运输
- hihoCoder 1168 运输货物
- [二分+曼哈顿距离] 51Nod1671 货物运输
- 输入货物的重量和运输的距离,自动计算出总运费
- 优步的无人驾驶卡车, 已经开启运输货物的服务!
- 【LCA&倍增】货物运输 @upcexam5909
- HDU 5699 二分+线性约束
- “一带一路”的亚欧货物运输走廊