【题目】
2154: E.wjw的排队问题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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;
}