• zzuli-2259 matrix


    题目描述

    在麦克雷的面前有N个数,以及一个R*C的矩阵。现在他的任务是从N个数中取出 R*C 个,并填入这个矩阵中。矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值。现在,麦克雷想知道矩阵的最小法值是多少。

    输入

    输入共两行。

    第一行是三个整数:n,r,c。(r, c <= 104, r * c <= n <= 106

    第二行是 n 个整数 Pi。(0 < pi <= 109)

    输出

    输出一个整数,即满足条件的最小的法值。

    样例输入

    7 2 3
    170 205 225 190 260 225 160
    

    样例输出

    30

    可以说是最大值最小化的模板题了,但是比赛的时候没写对。
    赛后想了想还是对这类题理解不深。
    二分枚举答案,只要找出满足答案的一种情况就行,不需要硬找出最佳的满足情况。所以这题里面直接for循环就好,不需要搜出所有r个的c的情况。

    附ac代码:
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e6;
     4 const int inf = 0x3f3f3f3f;
     5 int nu[maxn];
     6 int dis[maxn];
     7 int n, r, c;
     8 int fun(int minn)
     9 {
    10     int rr = 0;
    11     int i = c;
    12     while(i <= n)
    13     {
    14         if(dis[i] <= minn)
    15         {
    16             ++rr;
    17             if(rr == r) return 1;
    18             i += c;
    19         }
    20         else ++i;
    21     }
    22     return 0;
    23 }
    24 int main() {
    25 
    26     scanf("%d %d %d", &n, &r, &c);
    27     for(int i = 1; i <= n; ++i)
    28     {
    29         scanf("%d", &nu[i]);
    30     }
    31     sort(nu + 1, nu + 1 + n);
    32     for(int i = c; i <= n; ++i)
    33     {
    34         dis[i] = nu[i] - nu[i - c + 1];
    35     //    printf("%d ", dis[i]);
    36     }
    37     int lt = 0, rt = inf;
    38     while(lt <= rt)
    39     {
    40         int mid = lt + (rt - lt) / 2;
    41     //    printf("%d
    ", mid);
    42         if(fun(mid)) rt = mid - 1;
    43         else lt = mid + 1;
    44     }
    45     printf("%d
    ", lt);
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    【转】centos7关闭图形界面启动系统
    回顾测试入行以来的一些感受,浅谈对测试管理方面一些见解
    linux安装完全踩坑手册
    selenium 自动化测试个人总结(一)
    性能测试之数据库篇-查询(五 补充)
    性能测试之数据库篇-查询(四)
    性能测试之数据库篇-查询(三)
    性能测试之数据库篇-查询(二)
    性能测试之数据库篇-查询(一)
    性能测试之数据库篇-查询
  • 原文地址:https://www.cnblogs.com/zmin/p/8904346.html
Copyright © 2020-2023  润新知