宠物店
题目描述
宠物店里有N只宠物猫和N个笼子,一个笼子宽2 * X米,宠物店宽为MM米。
店长要求,所有猫咪排成一横排(我们假设猫咪站好后不会乱跑),猫咪之间不能重叠,猫咪所站位置也不能超出宠物店范围,猫咪的具体位置信息会给出。
一只猫咪一定会有一个笼子,笼子的门在笼子正中间,猫咪到笼子门之间的距离,就是猫咪回笼子要行走的路程,(本题中将猫咪行走过程理想化为一条直线),我们将现在由你安排笼子的位置,使得行走路程最长的小猫咪,走得尽可能的少。
输出这只行走路程最长的小喵咪的最短距离,如果宠物店装不下这么多笼子,输出-1。
输入格式
第1行:3个数N X M,中间用空格分隔(1≤N≤50000;11≤X≤10 9 ; 1≤M≤10 9 )。
第2 - NN + 1行:每行1个数P_iP i ,对应猫咪的位置(0≤Pi≤Pi+1≤M),并且给出的数据是有序的。
输出格式
输出这只行走路程最长的小喵咪的最短距离,如果宠物店装不下这么多笼子,输出-1。
样例解释
例如:N=3,X=2,M=20;三只猫咪的位置是2、5、10。笼子的宽为2 * 2 = 4,可以将笼子
(笼子门的位置)放在2、6、10。这样猫和猫之间可以没有重叠,而且第一只猫和第三只猫可以不用走动,它们的面前就是笼子门,只有第二只猫需要走1米。
数据范围
+对于15%的数据,1≤n≤20;1≤x,m≤200
对于30%的数据,1≤n≤50;1≤x,m≤5000
对于100%的数据,1≤n≤50000;1≤x,m≤10 9
样例
#1
3 2 20
2 5 10
1
#2
3 2 16
1 3 14
3
#3
2 10 21
2 15
-1
解法
本题可以使用二分找出最短距离即可。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,x,m,a[50010];
bool check(int mid){
int t = 0;
for(int i=1;i<=n;i++){
if(t+x<=a[i]+mid) t = max(t+x*2, a[i]+x-mid);
else return 0;
if(t>m) return 0;
}
return 1;
}
int main(){
scanf("%d%d%d",&n,&x,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
if(2*x*n>m){
printf("-1\n");
return 0;
}
int l=-1,r=m;
while(l+1<r){
int mid = l+r>>1;
if(check(mid)){
r = mid;
}else{
l = mid;
}
// cout << check(mid) << " " << mid << endl;
}
printf("%d\n",r);
return 0;
}