• 二分建火车站


    链接: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;
    } 
     
  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/lipu123/p/14354375.html
Copyright © 2020-2023  润新知