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;
}