二分建火车站

链接:https://ac.nowcoder.com/acm/contest/11746/L
来源:牛客网

新冠疫情,导致了各个城市之间物资输送的障碍。假设有N个城市在一条直线上,为了物资能顺利抵达各个城市,可以在路线上建立最多个数为K个暂时停靠站,由于火车在两个站台(城市也算站台)之间的距离越近,需要的总花费越少,因此我们需要让火车相邻两个站台之间的最大距离最小,求出距离L,2 ≤N ≤100000, 0 ≤K ≤100000,所有城市坐标小于等于10^12,且不存在负值。提醒: 城市坐标均为正整数,且停靠站只能建在整数坐标点上。

输入描述:

第一行输入城市个数N,可建立停靠站个数K,
第二行输入N个城市的坐标(不保证前一个城市坐标比后一个城市小)。
 

输出描述:

输出L
示例1

输入

复制
2 2
4 106

输出

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

 

 
posted @ 2021-01-31 22:13  哎呦哎(iui)  阅读(116)  评论(0编辑  收藏  举报