zoukankan      html  css  js  c++  java
  • 二分最大值最小问题

    题目描述

    一场别开生面的牛吃草大会就要在Farmer John的农场举办了!
    世界各地的奶牛将会到达当地的机场,前来参会并且吃草。具体地说,有N头奶牛到达了机场(1≤N≤105),其中奶牛i在时间ti(0≤ti≤109)到达。Farmer John安排了M(1≤M≤10^5)辆大巴来机场接这些奶牛。每辆大巴可以乘坐C头奶牛(1≤C≤N)。Farmer John正在机场等待奶牛们到来,并且准备安排到达的奶牛们乘坐大巴。当最后一头乘坐某辆大巴的奶牛到达的时候,这辆大巴就可以发车了。Farmer John想要做一个优秀的主办者,所以并不想让奶牛们在机场等待过长的时间。如果Farmer John合理地协调这些大巴,等待时间最长的奶牛等待的时间的最小值是多少?一头奶牛的等待时间等于她的到达时间与她乘坐的大巴的发车时间之差。

    输入保证MC≥N。

    输入描述:

    输入的第一行包含三个空格分隔的整数N,M和C。第二行包含N个空格分隔的整数,表示每头奶牛到达的时间。

    输出描述:

    输出一行,包含所有到达的奶牛中的最大等待时间的最小值。

    示例1

    输入

    6 3 2
    1 1 10 14 4 3
    

    输出

    4
    

    说明

    如果两头时间1到达的奶牛乘坐一辆巴士,时间2和时间4到达的奶牛乘坐乘坐第二辆,时间10和时间14到达的奶牛乘坐第三辆,那么等待时间最长的奶牛等待了4个单位时间(时间10到达的奶牛从时间10等到了时间14)。

    ans属于[0,maxn-minn]

    #include<bits/stdc++.h>
    using namespace std;
    inline char gc() {
        static char buf[100000],*L=buf,*R=buf;
        return L==R&&(R=(L=buf)+fread(buf,1,100000,stdin),L==R)?EOF:*L++;
    }
    template<typename T>
    inline void read(T&x) {
        char ch=gc();x=0;
        while (ch<'0'||ch>'9')ch=gc();
        while (ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-48,ch=gc();
    }
    typedef long long ll;
    const int M=1e5+10;
    int n,m,c,t[M];
    inline bool check(int val){//如果答案是val的话检查是否符合条件
        int st=1,num=1;
        for(int i=1;i<=n;++i)
            if(i-st+1>c||t[i]-t[st]>val)st=i,++num;
        if(num>m)return 0;
        return 1;
    }
    inline int binary(){
        int l=0,r=t[n]-t[1],mid,res=0x3f3f3f3f;
        while(l<=r){
            mid=(l+r)>>1;
            if(check(mid)){r=mid-1;res=min(res,mid);}
            //如果mid符合条件,说明答案在[l,mid-1]、mid之间,故先保存mid,再找更小的答案。
            else l=mid+1;
            //r如果mid不符合,则答案在(mid,r]之间,即[mid+1,r]之间,
        }
        return res;
    }
    int main(){
        //freopen("in.txt","r",stdin);
        read(n),read(m),read(c);
        for(int i=1;i<=n;++i)read(t[i]);
        sort(t+1,t+n+1);
        cout<<binary();
        return 0;
    }
    
  • 相关阅读:
    C#泛型使用小记
    Unity3d + NGUI 的多分辨率适配
    CodeSmith(1 生成实体)
    从数据库读取数据Table后转成对应的实体泛型方法
    安卓data./data没数据的时候
    Java工具
    SqlBulkCopy 用法
    Wind7 64位配置安卓环境
    .net和c#下的自定义配置
    Log4Net可以根据不同的类容输出到不同的文件夹下面
  • 原文地址:https://www.cnblogs.com/foursmonth/p/14136282.html
Copyright © 2011-2022 走看看