[COCI2021-2022#6] Zemljište
[COCI2021-2022#6] Zemljište
题意
给出一个矩阵,一个子矩阵的权值为
求该矩阵权值最小的子矩阵。
思路
枚举子矩阵上界和下界,左右界使用双指针枚举,令
对于每个左界,不断扩展右界直到子矩阵和大于
每次扩展时统计答案即可。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 505 + 5;
int r, s, a, b, ans = 1e9;
int v[N][N], sum[N][N];
int val(int x_1, int y_1, int x_2, int y_2) {
return sum[x_2][y_2] - sum[x_1 - 1][y_2] - sum[x_2][y_1 - 1] + sum[x_1 - 1][y_1 - 1];
}
int calc(int x_1, int y_1, int x_2, int y_2) {
return abs(a - val(x_1, y_1, x_2, y_2)) + abs(b - val(x_1, y_1, x_2, y_2));
}
void solve() {
cin >> r >> s >> a >> b;
if (a > b) swap(a, b);
for (int i = 1; i <= r; i ++)
for (int j = 1; j <= s; j ++)
cin >> v[i][j];
for (int i = 1; i <= r; i ++)
for (int j = 1; j <= s; j ++)
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] + v[i][j] - sum[i - 1][j - 1];
for (int i = 1; i <= r; i ++) {
for (int j = i; j <= r; j ++) {
for (int L = 1, R = 1; L <= s; L ++) {
R = max(L, R);
while (R < s && val(i, L, j, R) <= b)
ans = min(ans, calc(i, L, j, R)), R ++;
ans = min(ans, calc(i, L, j, R));
}
}
}
cout << ans << "\n";
}
signed main() {
int T = 1;
// cin >> T;
while (T --)
solve();
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18407230,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】