matrix(二分)

时间限制: 1 Sec 内存限制: 256 MB
提交: 169 解决: 24
[提交][状态][讨论版][命题人:admin]
题目描述

在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出 R*C 个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少。
输入

输入共两行。

第一行是三个整数:n,r,c。(r, c <= 104, r * c <= n <= 106)

第二行是 n 个整数 Pi。(0 < pi <= 109)
输出

输出一个整数,即满足条件的最小的法值。
样例输入

7 2 3
170 205 225 190 260 225 160

样例输出

30
这次比赛经验:1.一个人力量太小2.榜单并不一定适合自己,有很多水题都没有看3.还是多刷题吧
话不多说,这道题直接二分答案,然后判断区间数是否满足即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10
int s[N],R,c,n;
bool ok(int x)
{
    int t=0;
    for(int i=0;i<=n-c;++i)
        if(s[i+c-1]-s[i]<=x)
        {
            i+=c-1;
            t++;
        }
    return t>=R;
}
int main(){
    cin>>n>>R>>c;
    for(int i=0;i<n;++i)
        cin>>s[i];
    sort(s,s+n);
    int l=0,r=s[n-1]-*s;
    for(int m;l<r;)
    {
        m=l+r>>1;
        if(ok(m))
            r=m;
        else
            l=m+1;
    }
    cout<<l<<endl;
}
posted @ 2018-04-21 20:21  ffgcc  阅读(150)  评论(0)    收藏  举报