1 条题解

  • 0
    @ 2025-8-24 21:14:39

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 一扶苏一
    休息结束。邮箱 yifusuyi@qq.com

    搬运于2025-08-24 21:14:38,当前版本为作者最后更新于2018-05-27 21:07:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    [语言月赛202303] Carrot Harvest G 题解

    Source & Knowledge

    2023 年 3 月语言月赛,由洛谷网校入门计划/基础计划提供。

    本题考察循环结构。

    文字题解

    题目大意

    给出 nnmm 列共 n×mn \times m 个数,每个数要么是 00 要么是 11,形成了一个矩形。

    选择一个包含数字的数量最少的矩形区域,满足这个区域里的数字之和不低于 kk

    1n,m201 \leq n, m \leq 201k4001 \leq k \leq 400

    解析

    考虑枚举所有可能的矩形区域:

    用一个两重的 for 循环 i,ji,j 枚举矩形区域左上角所在的行和列,再用一个两重的 for 循环 x,yx, y 枚举矩形区域右下角所在的行和列。这样可以唯一确定所求的矩形区域。注意因为 (i,j)(i,j)(x,y)(x, y) 的右下角,所以应该满足 xix \geq iyjy \geq j

    枚举出矩形区域后,可以继续在里面嵌套两层循环,求出区域内部的数字之和。

    for (int i = 1; i <= n; ++i)
      for (int j = 1; j <= m; ++j) // i 和 j 枚举左上角
        for (int x = i; x <= n; ++x) // x>=i 所以从 i 开始枚举
          for (int y = j; y <= m; ++y) {// x 和 y 枚举右下角 
            int sum = 0; // sum 表示当前矩形区域的和
            for (int p = i; p <= x; ++p) 
              for (int q = j; q <= y; ++q)
                sum += a[i];
          }
    

    求出 sumsum 后,可以把 sumsumkk 作比较。如果 sumksum \geq k,则比较一下当前区域所包含的数字数,尝试更新答案。显然当前区域包含的数字数是 (xi+1)×(yj+1)(x - i + 1) \times (y - j + 1)

    if (sum >= k) ans = min(ans, (x - i + 1) * (y - j + 1));
    

    最后输出答案,就完成了本题。

    视频题解

    视频题解

    完整代码请在视频中观看

    • 1

    信息

    ID
    8331
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者