hiho1362 修补木桶

来源:互联网 发布:linux多线程服务端编程 编辑:程序博客网 时间:2024/06/10 05:43
/*
最小值最大用二分,枚举起点,二分答案,判断答案是否合法
因为L*M<N,每选L次起点,判断需要修补的最小值,如果比M小
答案可以更大一点,如果比M大,答案小一点
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100000000
int a[1010];
int L,M,N;

int bsol(int x)
{
    int num=0;
    for(int i=0;i<N;i++)
    {
        if(a[i]<x)
        {
            num++;
            i+=(L-1);
        }
    }
    return num;
}

int main()
{
    cin>>N>>M>>L;
    for(int i=0;i<N;i++)
        cin>>a[i];
    int l=0,r=maxn;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        int num=100000;
        for(int i=0;i<L;i++)
        {
            for(int j=0;j<N-1;j++)
                swap(a[j],a[j+1]);//枚举起点
            num=min(num,bsol(mid));
        }
        if(num<=M)
            l=mid+1;
        else
            r=mid-1;
    }
    cout<<r<<endl;
}


0 0
原创粉丝点击