宠物店 c++

14 篇文章 0 订阅

宠物店

题目描述

宠物店里有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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值