B: matrix
题目描述
在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出 R*C 个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少。
输入
输入共两行。
第一行是三个整数:n,r,c。(r, c <= 104, r * c <= n <= 106)
第二行是 n 个整数 Pi。(0 < pi <= 109)
输出
输出一个整数,即满足条件的最小的法值。
样例输入
7 2 3170 205 225 190 260 225 160
样例输出
30
解题思路:二分,类似于NYOJ 的 疯牛,则让距离从1开始到最大值,若可以找到这样的数组,就一直找下去
代码如下:
# include<stdio.h>
# include<algorithm>
using namespace std;
int n,m,r,c;
int a[1000005];
int find(int mid) //判断是否可以找到r*c 数组 ,找到返回1,否则0
{
int num=0;
for(int i=0;i<n;i++)
{
if(a[i+c-1]-a[i]<=mid&&(i+c-1)<n){
num++;
i=i+c-1;
}
}
if(num>=r)
return 1;
return 0;
}
int main(){
scanf("%d%d%d",&n,&r,&c);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int max=a[n-1]-a[0],min=a[n-1]-a[0];
for(int i=1;i<n;i++) //找到最小距离
{
if(min>a[i]-a[i-1])
{
min=a[i]-a[i-1];
}
}
while(min<=max)
{
int mid=(min+max)/2;
if(find(mid)) //如果返回1 ,说明距离过大
max=mid-1;
else min=mid+1; //返回0 ,说明距离过小
}
printf("%d\n",min);
return 0;
}