问题 B: matrix
时间限制: 1 Sec 内存限制: 256 MB提交: 211 解决: 42
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
在麦克雷的面前有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
贪心,从小到大排序处理每隔c个相减的差值,最后二分一下答案查看是否满足有条件的个数是否大于等于r.
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define mod 1000000007
#define ll long long
#define N 1100000
int n, r, c;
ll a[N];
ll b[N];
int cnt = 0;
bool judeg(ll x)
{
int sum = 0;
for(int i = 1; i <= cnt;) {
if(b[i] <= x) {
sum++;
i+=c;
}else
i++;
}
return sum >= r;
}
int main()
{
scanf("%d%d%d", &n, &r, &c);
for(int i = 1; i<= n;i++) {
scanf("%lld", &a[i]);
}
sort(a+1, a+n+1);
cnt = 0;
for(int i = c; i <= n; i++) {
b[++cnt] = a[i]-a[i-c+1];
}
ll l = 0, r = a[n];
ll ans= 0 ;
while(l<r) {
ll mid = (l+r)/2;
if(judeg(mid)) {
ans = mid;
r = mid;
}else {
l = mid+1;
}
}
printf("%lld\n", r);
return 0;
}