[COCI2021-2022#6] Zemljište
[COCI2021-2022#6] Zemljište
题目描述
有一块地,大小为 , 想买下它。这块地每个 的正方形都有不同的价格。
设一片非空子矩阵价格总和为 ,则这片子矩阵的权值为 ,您需要找到最小权值的子矩阵。
您只需要输出最小权值即可。
输入格式
第一行包含四个正整数 , , 和 。
下面 行,第 行,有 个正整数,第 个数表示 ,表示价格。
输出格式
一行一个整数 ,表示最小非空子矩阵的权值。
样例 #1
样例输入 #1
2 2 10 10
1 3
4 1
样例输出 #1
2
样例 #2
样例输入 #2
3 2 3 4
1 9
1 1
8 1
样例输出 #2
3
样例 #3
样例输入 #3
3 4 5 3
1 1 1 1
9 6 7 6
8 1 9 7
样例输出 #3
2
提示
样例解释 2
如图,总价格是,这块地的权值是 。
数据范围:
对于 的数据:
对于 的数据:
对于 的数据:,
本题分值与 [COCI 2021-2022#6] 分值相同,满分 分
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 510;
LL s[N][N];
LL get(int x1, int y1, int x2, int y2) {
return s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
}
int main() {
int n, m, a, b;
scanf("%d %d %d %d", &n, &m, &a, &b);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%lld", &s[i][j]);
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
}
}
LL ret = 1e18;
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
for (int k = 1, u = 1, v = 1; k <= m; k++) {
while (u < k && get(i, u, j, k) > a) {
u++;
}
LL t = get(i, u, j, k);
ret = min(ret, abs(t - a) + abs(t - b));
while (v < k && get(i, v + 1, j, k) >= b) {
v++;
}
t = get(i, v, j, k);
ret = min(ret, abs(t - a) + abs(t - b));
}
}
}
printf("%lld", ret);
return 0;
}
参考资料
P8343 题解:https://www.luogu.com.cn/blog/xiaolu12356/solution-p8343
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17776269.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效