zzuli第十届校赛

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值