洛谷P3017
P3017 [USACO11MAR] Brownie Slicing G
为什么会塞蓝题啊我真的想不通啊
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int L = 510;
int w[L][L], s[L][L];
int r, c, a, b;
bool check(int x) {
int rows = 0, new_row = 1;
for(int i = 1; i <= r; i++) {
int cols = 0, new_col = 1;
for(int j = 1; j <= c; j++) {
int sum = s[i][j] - s[new_row - 1][j] - s[i][new_col - 1] + s[new_row - 1][new_col - 1];
if(sum >= x) {
cols++;
new_col = j + 1;
}
}
if(cols >= b) {
rows++;
new_row = i + 1;
}
}
return rows >= a;
}
int main() {
cin >> r >> c >> a >> b;
for(int i = 1; i <= r; i++){
for(int j = 1; j <= c; j++) {
cin >> w[i][j];
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + w[i][j];
}
}
int left = 0, right = s[r][c], ans = 0;
while(left <= right) {
int mid = (left + right) / 2;
if(check(mid)) {
ans = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
cout << ans << '\n';
return 0;
}
记点东西:
一般遇到“求符合条件的最大值”之类的问题第一时间还是得考虑二分答案(虽然我真的很讨厌很不擅长二分答案)
这题做法是先对所有方块里的巧克力进行二维前缀求和,在[0, 巧克力总和]这一区间内搜索符合条件的最大值答案。
答案合理的条件:设最小块巧克力量(即答案ans)为待二分区间mid值,若取某一矩形位置巧克力且总量为mid后,剩余的巧克力可以拼凑成A*B-1个矩形且值都大于等于mid,条件成立,更新ans值为mid并缩小区间为[mid + 1,(不变)]从而向上探索,未成立则保持ans不变,改变区间为[(不变),mid - 1],向下探索

浙公网安备 33010602011771号