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;
}