[USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)

[USACO11MAR] Brownie Slicing G

题目地址

P3017 [USACO11MAR] Brownie Slicing G

思路

二分最大化最小值

切割思路:

一行一行进行切割,如果这一行可以切割出b块大于等于mid的块,就开始切割下一行

如果无法切割出b块,就把正在切割的行与下一行拼起来一起切割

最后通过能切割出b块的水平块块够不够a条来判断m是否合适

代码

cpp 复制代码
#include <iostream>

using namespace std;

int a[1010][1010], s[1010][1010];
int r, c, x, y;

bool check(int m) {
    int lrow = 0;
    int rows = 0;
    for (int i = 1; i <= r; i ++) {
        int num = 0, sum = 0;
        for (int j = 1; j <= c; j ++) {
            if (sum + (s[i][j]-s[i][j-1])-(s[lrow][j]-s[lrow][j-1]) < m)
                sum += (s[i][j]-s[i][j-1])-(s[lrow][j]-s[lrow][j-1]);
            else {
                sum = 0;
                num ++;
            }
        }
        if (num >= y) {
            lrow = i;
            ++ rows;
        }

    }
    return rows >= x;
}

int main() {

    cin >> r >> c >> x >> y;
    for (int i = 1; i <= r; i ++)
        for (int j = 1; j <= c; j ++) {
            cin >> a[i][j];
            s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
        }
    int left = 0, right = s[r][c];
    //m 越小越容易成功
    while (left < right) {
        int m = left + right + 1 >> 1;
        if (check(m))
            left = m;
        else
            right = m - 1;
    }
    cout << left;

    return 0;
}
相关推荐
智驱力人工智能几秒前
矿场轨道异物AI监测系统 构建矿山运输安全的智能感知防线 轨道异物检测 基于YOLO的轨道异物识别算法 地铁隧道轨道异物实时预警技术
人工智能·opencv·算法·安全·yolo·边缘计算
橘颂TA8 分钟前
【剑斩OFFER】算法的暴力美学——leetcode 429 题:N 叉树的层序遍历
算法
"YOUDIG"10 分钟前
信稿笺纸设计工具:传统排版美学与数字化设计的高效融合
科技·考研·算法·面试·职场和发展·高考
程序员-King.10 分钟前
day126—二分查找—寻找旋转排序数组中的最小值(LeetCode-153)
算法·leetcode·二分查找
菜鸟233号10 分钟前
力扣494 目标和 java实现
java·数据结构·算法·leetcode
有一个好名字11 分钟前
力扣-字符串解码
java·算法·leetcode
李日灐12 分钟前
C++STL:deque、priority_queue详解!!:详解原理和底层
开发语言·数据结构·c++·后端·stl
sali-tec15 分钟前
C# 基于OpenCv的视觉工作流-章9-均值滤波
人工智能·opencv·算法·计算机视觉·均值算法
万行16 分钟前
机器学习&第六.七章决策树,集成学习
人工智能·python·算法·决策树·机器学习·集成学习
sin_hielo17 分钟前
leetcode 1266
数据结构·算法·leetcode