鄭州輕工業第十屆ACM程序設計大賽邀請賽正式賽B題matrix

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

發佈了189 篇原創文章 · 獲贊 77 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章