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

这篇具有很好参考价值的文章主要介绍了[USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[USACO11MAR] Brownie Slicing G

题目地址

P3017 [USACO11MAR] Brownie Slicing G

思路

二分最大化最小值
切割思路:

一行一行进行切割,如果这一行可以切割出b块大于等于mid的块,就开始切割下一行
如果无法切割出b块,就把正在切割的行与下一行拼起来一起切割
最后通过能切割出b块的水平块块够不够a条来判断m是否合适文章来源地址https://www.toymoban.com/news/detail-724038.html

代码

#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;
}

到了这里,关于[USACO11MAR] Brownie Slicing G题解(二分+二维前缀和+矩阵分割)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • E. Scuza - 二分+前缀和

       分析:         暴力会超时,可以用二分,构建两个数组,一个是a[i],作为前缀和数组,一个是f[i]表示第i个台阶之前的最大高度的台阶,然后每次二分来查找k,因为尽可能地走的多,所以查找右边界,最后输出对应的前缀和。 代码:

    2024年02月13日
    浏览(40)
  • 【二分与前缀和】python例题详解

    文章目录 1、数的范围 2、数的三次方根 3、前缀和 4、子矩阵的和 5、机器人跳跃问题 1、数的范围 题目 给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k的起始位置和终止位置(位置从 00 开始计数)。如果数组中不存在该元

    2024年04月28日
    浏览(43)
  • AcWing 102:最佳牛围栏 ← 二分+前缀和

    【题目来源】 https://www.acwing.com/problem/content/104/ 【题目描述】 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到

    2024年01月20日
    浏览(40)
  • 前缀和--二维矩阵的前缀和

    原题链接 输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2 ,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n,m,q 。 接下来 n 行,每行包含 m 个整数,表示整数矩阵。

    2024年01月16日
    浏览(43)
  • 有一些东西必不可少(前后背包+二分/前缀和优化)

    题意: 给定n个物品,每个物品具有权值a[i],在这些物品里选出若干个物品,使得权值和=k,就说是一个合法的方案。对于一个物品,如果存在一个合法的方案,在这个方案中去掉它以后方案就变成不合法了,就说这个物品是“必要的”。求有多少个物品是必要的。 n=5000,k=50

    2024年02月08日
    浏览(36)
  • 蓝桥杯刷题015——最少刷题数(二分法+前缀和)

    问题描述 小蓝老师教的编程课有  N 名学生 , 编号依次是 1…N  。 第 i 号学生这学期刷题的数量是 Ai​  。 对于每一名学生, 请你计算他 至少 还要再刷多少道题 , 才能使得 全班刷题比他多的学生数不超过刷题比他少的学生数。 输入格式 第一行包含一个正整数 N 。 第二

    2023年04月14日
    浏览(44)
  • C++ 二维差分 二维前缀和逆运算 差分矩阵

    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c 。 请你将进行完所有操作后的矩阵输出。 输入格式 第一行包含整数

    2024年02月21日
    浏览(55)
  • 【力扣】304. 二维区域和检索 - 矩阵不可变 <二维前缀和>

    给定一个二维矩阵 matrix ,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。 实现 NumMatrix 类: NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化 int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, co

    2024年02月10日
    浏览(40)
  • 一、二维前缀和算法

    一维前缀和: 二维前缀和: 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中

    2024年02月16日
    浏览(35)
  • 前缀和算法【一维、二维】

    首先这种算法适合于求 从 x 到 y 的和 。 一维代码十分简单,我们只需要每个都记录前面所有的和即可,注意细节 下标从1开始 这里我们就看两种情况:一种是 开始时 ,一种是 执行中 在开始时,因为我们是从1开始,a[0] = 0,所以第一个就是temp; 在执行过程中,因为前一个是

    2023年04月18日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包