18729 太空航站

18729 太空航站

时间限制:1000MS  代码长度限制:10KB

提交次数:0 通过次数:0

题型: 编程题 语言: 不限定
Description
市政府在基地一和基地二之间修建了n个太空航站,其中基地一为第1个航站,基地二为第n个航站,其他航站在两个基地之间。
我们把相邻航站的距离定义为“空间差”,显然飞船的续航能力必须大于等于这个空间差才能在两个航站间航行。
把所有相邻航站间空间差的最大值定义为“空间极差”,如果一艘飞船想从基地一航行至基地二,
那么它的续航能力必须大于等于“空间极差”,这样看能满足航行条件的飞船太少了。
现在市政府打算在基地一和基地二之间新增最多K个太空航站,让尽可能多的飞船可以在基地一和基地二之间航行。
简单说就是让所有航站间的“空间极差”尽可能地小。

输入格式
第一行为两个整数n和k。(2=<n<=100000),(1=<k<=100)
第二行,n个正整数a1…an。(a1<=a2<=a3…<=an)

输出格式
仅一行,新增最多K个太空航站后,“空间极差”的最小值。

输入样例
2 1
0 105

输出样例
53

提示
新的空间站建设在坐标52或53可以得到最小空间极差。

分析:

二分法仅用于提高程序效率,核心思想是cheak函数,传入一个值,并“试探”k个站点是否足够“填坑”。

代码:

#include <iostream>

using namespace std;

int n,k,a[200000],i,j,maxs=0,best,mid;

int cheak(int x)
{
	int count=0,i,t1,t2,t3;
	for(i=2;i<=n&&count<=k;i++)
	{
		t1=(a[i]-a[i-1])/x; //作为count的增量 
		t2=t1*x; 
		t3=a[i]-a[i-1]; //与t2的差值用来判定前后元素的差是否为mid的倍数 
		if(t1<1)
		continue;
		if(t1==1&&t2==t3)
		continue;
		if(t1==1&&t2!=t3)
		count++;
		if(t1>1&&t2==t3)
		count+=t1-1;
		if(t1>1&&t2!=t3)
		count+=t1;
	}
	return count<=k;
}

int main(void)
{
	cin>>n>>k;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
		if(i>=2)
		maxs=max(maxs,a[i]-a[i-1]);
	}
	int low=1,high=maxs;//二分法查找最小值
	best=maxs;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(cheak(mid))
		{
			best=mid;
			high=mid-1;
		}
		else
		{
			low=mid+1;
		}
	} 
	cout<<best;
	return 0;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值