链接:https://ac.nowcoder.com/acm/contest/11746/L
来源:牛客网
新冠疫情,导致了各个城市之间物资输送的障碍。假设有N个城市在一条直线上,为了物资能顺利抵达各个城市,可以在路线上建立最多个数为K个暂时停靠站,由于火车在两个站台(城市也算站台)之间的距离越近,需要的总花费越少,因此我们需要让火车相邻两个站台之间的最大距离最小,求出距离L,2 ≤N ≤100000, 0 ≤K ≤100000,所有城市坐标小于等于10^12,且不存在负值。提醒: 城市坐标均为正整数,且停靠站只能建在整数坐标点上。
输入描述:
第一行输入城市个数N,可建立停靠站个数K, 第二行输入N个城市的坐标(不保证前一个城市坐标比后一个城市小)。
输出描述:
输出L
示例1
输出
复制34
就是一个二分答案judge判断
就是判断的时候这里,比如x=3,n=2,分别为1 7,很明显建一个就行,这个(a[i]-a[i-1])%x==0的时候,答案增加
(a[i]-a[i-1])/x-1,否者就是(a[i]-a[i-1])/x;
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int maxn=1e6+100; ll n,m; ll a[maxn]; //1 7 int judge(ll x){ ll ans=0; for(int i=2;i<=n;i++){ if((a[i]-a[i-1])%x==0){ ans+=((a[i]-a[i-1])/x-1); } else{ ans+=(a[i]-a[i-1])/x; } } if(ans<=m){ return 1; } else{ return 0; } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } sort(a+1,a+n+1); ll l=1; ll r=1e13; ll ans; while(r>=l){ ll mid=(l+r)/2; if(judge(mid)){ r=mid-1; ans=mid; } else{ l=mid+1; } } cout<<ans<<endl; }