题目背景

对应的选择、判断题:试题 - GESP 202406 C++ 五级 - 洛谷有题

题目描述

小杨有一个 n 行 m 列的网格图,其中每个格子要么是白色,要么是黑色。

小杨想知道至少包含 k 个黑色格子的最小子矩形包含了多少个格子。

输入格式

第一行包含三个正整数 n,m,k,含义如题面所示。

之后 n 行,每行⼀个长度为 m 的 01 串,代表网格图第 i 行格子的颜色,如果为 0,则对应格子为白色,否则为黑色。

输出格式

输出一个整数,代表至少包含 k 个黑色格子的最小子矩形包含格子的数量,如果不存在则输出 0。

输入输出样例

输入 #1复制

4 5 5
00000
01111
00011
00011

输出 #1复制

6

说明/提示

样例解释

对于样例 1,假设 (i,j) 代表第 i 行第 j 列,至少包含 5 个黑色格子的最小子矩形的四个顶点为 (2,4),(2,5),(4,4),(4,5),共包含 6 个格子。

数据范围

对于全部数据,保证有 1≤n,m≤100,1≤k≤n×m。

子任务编号 得分 n,m
1 20 ≤10
2 40 n=1,1≤m≤100
3 40 ≤100

Update on 2024/7/9:添加了若干组 hack 数据,感谢 @cff_0102 的贡献。

代码实现:

#include <iostream>
#include <string>
#include <climits>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m, k;
    cin >> n >> m >> k;
    int pre[105][105] = {0};
    for (int i = 1; i <= n; i++)
    {
        string s;
        cin >> s;
        for (int j = 1; j <= m; j++)
        {
            pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + (s[j - 1] == '1');
        }
    }
    int ans = INT_MAX;
    for (int x1 = 1; x1 <= n; x1++)
    {
        for (int x2 = x1; x2 <= n; x2++)
        {
            for (int y1 = 1; y1 <= m; y1++)
            {
                for (int y2 = y1; y2 <= m; y2++)
                {
                    int sum = pre[x2][y2] - pre[x1 - 1][y2] - pre[x2][y1 - 1] + pre[x1 - 1][y1 - 1];
                    if (sum >= k)
                    {
                        int area = (x2 - x1 + 1) * (y2 - y1 + 1);
                        if (area < ans) ans = area;
                    }
                }
            }
        }
    }
    if (ans == INT_MAX) cout << 0 << '\n';
    else cout << ans << '\n';
    return 0;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐