《P10719 [GESP202406 五级] 黑白格》
📅 2026/7/3 1:47:47
👁️ 阅读次数
📝 编程学习
题目背景
对应的选择、判断题:试题 - 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; }
编程学习
技术分享
实战经验