Description
给出N个数,我们需要选择其中的R x C个数,,把它们填入一个R x C的矩阵(R行C列)中。
我们先定义一个函数D(i)代表第i行中最大的数和最小的数之差。对于整个矩阵,定义F为矩阵中D(i) (1<=i<=R)的最大值。
我们需要F的值最少,你能求出最少可能达到的F值是多少吗?
题解
首先,我们可以将读入n个数从小到大排序
用二分求出可能出现的情况
那么怎么判断是否可以呢
判断每一行得到的d[i],也就是这行最后的减最前的
判断这个数是否大于这次二分求出的情况
如果每一行都不大于
那这一个情况就是可行的
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,r,c,p[500050];
bool check(int x)
{
int f[500050];
for (int i=0;i<=c-1;i++) f[i]=0;
for (int i=c;i<=n;i++)
{
f[i]=f[i-1];
if (p[i]-p[i-c+1]<=x) if (f[i-c]+1>f[i]) f[i]=f[i-c]+1;
}
if (f[n]>=r) return true; else return false;
}
int main()
{
scanf("%d%d%d",&n,&r,&c);
for (int i=1;i<=n;i++) scanf("%d",&p[i]);
sort(p+1,p+n+1);
int l=0,r=p[n]-p[1],mid;
while (l<r)
{
mid=(l+r)>>1;
if (check(mid)) r=mid;
else l=mid+1;
}
printf("%d",l);
}