时间限制: 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;
}