HDU 5699 货物运输

来源:互联网 发布:现在还有网络聊天室吗 编辑:程序博客网 时间:2024/05/01 18:39

题目连接:点击打开链接


使得运输方案的最长时间最小,很明显有二分的性质,然而此题的问题在于如何检测所有的运输时间都小于给定值mid


假设传送点在x和y上(x<y),那么每个运输方案的时间为min(ri-li, |li-x|+|ri-y|)


如果ri-li<=mid就直接可行,否则要判断 |li-x|+|ri-y|是否小于mid


但是这个不是很好看出怎么判断,我们不妨把(li,ri)都当成平面上的点,那么|li-x|+|ri-y|就相当于(x,y)到(li,ri)的哈密顿距离,于是问题就变成

是否存在一个位置,使得距离所有的点的哈密顿距离都不超过mid

可以画张图

判断一下需要覆盖的范围能不能被能覆盖的范围完全覆盖到即可,这就简单多了


下面代码

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <string>#include <iostream>#include <algorithm>#include <set>#include <vector>#include <queue>#include <map>#define fi first#define se secondusing namespace std;typedef long long ll;typedef pair<int, int> PII;const int inf = 0x3fffffff;const int maxn=1000000;PII a[maxn+10];int n,m;bool check(int mid){int mn1,mn2,mx1,mx2;mn1=mn2=inf; mx1=mx2=-inf;for (int i = 0; i < m; ++i){if(a[i].se-a[i].fi<=mid) continue;mn1=min(mn1,a[i].fi+a[i].se);mx1=max(mx1,a[i].fi+a[i].se);mn2=min(mn2,a[i].fi-a[i].se);mx2=max(mx2,a[i].fi-a[i].se);}if(mx1==-inf) return true;else if(mx1-mn1>2*mid || mx2-mn2>2*mid) return false;else return true;}int main() {#ifndef ONLINE_JUDGE    freopen("test.in", "r", stdin);#endif    while(~scanf("%d%d",&n,&m)){    //printf("Case #%d:\n",cas);    for (int i = 0; i < m; ++i)    {    scanf("%d%d",&a[i].fi, &a[i].se);    if(a[i].fi>a[i].se) swap(a[i].fi,a[i].se);    }    int l=-1, r=maxn;    while(r-l>1){    int mid=(l+r)/2;    if(check(mid)) r=mid;    else l=mid;    }    printf("%d\n",r);    }    return 0;}

0 0
原创粉丝点击