您的位置:首页 > 其它

hiho1362 修补木桶

2016-09-03 20:41 239 查看
/*

最小值最大用二分,枚举起点,二分答案,判断答案是否合法

因为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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分 ACM