郑州轻工业第十届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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章