洛谷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],向下探索

posted @ 2025-05-18 19:02  Chuan81  阅读(13)  评论(0)    收藏  举报