zoukankan      html  css  js  c++  java
  • 二分建火车站

    链接: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;
    } 
     
  • 相关阅读:
    leecode4:寻找两个正序数组的中位数
    leecode3:无重复字符的最长子串
    leecode2:两数相加
    KMP字符串模式匹配
    01迷宫问题
    汉诺塔问题
    微服务-基于Grpc的进程通信-Grpc异常捕获RpcException(4-4)
    React-Antd Pro增删改查
    HTTP 请求
    创业路上-1
  • 原文地址:https://www.cnblogs.com/lipu123/p/14354375.html
Copyright © 2011-2022 走看看