zcmu 2154 wjw的排队问题

【题目】

2154: E.wjw的排队问题

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 23   Solved: 11
[ Submit][ Status][ Web Board]

Description

wjw作为班里的学习委员,虽然是个学习委员,但是谁让班长ly经常不靠谱呢,每次当ly不靠谱的时候,总是需要wjw帮她解决问题...现在临近体育课,ly拿到了你的代码但是没办法运行,于是傻乎乎的去找电脑了...但是眼看着马上就要上课了,班里的同学还三三两两的几个人围在一起聊天,wjw没有办法,一下子让所有人按身高排序是来不及了,所以wjw决定用最快的速度让所有人排好队,不要求身高,只要每个人不站在一起就可以了...
现在机智的wjw所有人抽象在一条X轴上,在这条X轴的一些整数坐标上,存在很多小团体,第i个小团体的人数是a[i],所在的坐标是b[i]。
现在wjw要让这些人每个人站在一个整数坐标点上,并且使得没有两个人在同一个点上。
为了节约时间,wjw希望每个人的移动距离的最大值最小,请你求出这个最小值

Input

只有一组数据
第一行一个正整数n,表示有多少个小团体
第二行n个正整数a[i],表示第i个小团体的人数
第三行n个严格递增的整数b[i],表示第i个小团体的坐标

Output

一行一个非负整数,表示每个人的移动距离的最大值的最小值

Sample Input

2
2 3
0 2

Sample Output

1

HINT

n<=1000

a[i],b[i]<=100000

【题解】

题目想要的是每个人的移动距离的最大值的最小值,又答案具有单调性,即x满足那么x+1也满足,所以用二分,check的时候注意将位置优先分布在左边即可。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int inf=0x7f7f7f7f;
int a[1005],b[1005],n;
int f(int mid)
{
    int i,x=b[0]-mid;
    for(i=0;i<n;i++)
    {
        x=max(x,b[i]-mid);
        if(b[i]+mid-x+1<a[i])
            return 0;
        x+=a[i];
    }
    return 1;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&b[i]);
        int l=1,r=inf,mid;
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(f(mid))
                r=mid-1;
            else
                l=mid+1;
        }
        printf("%d\n",l);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/80854826