hdu5699 货物运输(二分)

来源:互联网 发布:越知月光x毛利寿三郎h 编辑:程序博客网 时间:2024/05/01 10:10

题目链接:点这里!!!


题意:中文题


题解:

1、直接去二分答案。

2、我们假设传送为l,r,我们二分的答案为d。我们对所有运输方式来进行计算。

3、如果R-L<=d我们我不去考虑。

4、对于R-L>d,有|L-l|+|R-r|<=d,进行去绝对值加合并得到:

L+R-d<=l+r<=L+R+d

L-R-d<=l-r<=L-R+d

5、对上面的不等式判断是否可行就ok啦!!!


代码:

#include<cstdio>#include<cstring>#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<bitset>#include<set>#include<queue>#include<stack>#include<map>#include<cstdlib>#include<cmath>#define LL long long#define pb push_back#define pa pair<int,int>#define clr(a,b) memset(a,b,sizeof(a))#define lson lr<<1,l,mid#define rson lr<<1|1,mid+1,r#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)#define key_value ch[ch[root][1]][0]#pragma comment(linker, "/STACK:102400000000,102400000000")const LL  MOD = 1000000007;const int N = 1e6+15;const int maxn = 1e5+15;const int letter = 130;const int INF = 2e9;const double pi=acos(-1.0);const double eps=1e-10;using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,m;int l[N],r[N];bool check(int x){    int min1=INF,max1=-INF;    for(int i=0;i<m;i++){        if(r[i]-l[i]<=x) continue;        min1=min(min1,r[i]+l[i]+x);        max1=max(max1,r[i]+l[i]-x);    }    if(min1<max1) return 0;    min1=INF,max1=-INF;    for(int i=0;i<m;i++){        if(r[i]-l[i]<=x) continue;        min1=min(min1,l[i]-r[i]+x);        max1=max(max1,l[i]-r[i]-x);    }    if(min1<max1) return 0;    return 1;}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=0;i<m;i++){            scanf("%d%d",l+i,r+i);            if(l[i]>r[i]) swap(l[i],r[i]);        }        int l=1,r=n,mid;        while(l<r){            mid=(l+r)>>1;            if(check(mid)) r=mid;            else l=mid+1;        }        printf("%d\n",r);    }    return 0;}


0 0