首页 > 其他分享 >洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G

洛谷题单指南-前缀和差分与离散化-P3017 [USACO11MAR] Brownie Slicing G

时间:2024-07-30 14:53:59浏览次数:18  
标签:rows int 洛谷题 矩阵 Brownie Slicing new col row

原题链接:https://www.luogu.com.cn/problem/P3017

题意解读:将一个r*c的矩阵,横向切成a条,每一条纵向切除b块,计算每一块子矩阵之和的最小值最大是多少。

解题思路:

要计算最小值中最大的,直觉上可以采用二分,下面来分析单调性:

给定一个子矩阵块之和的值,值越小可以划分的条数、块数就越多,因此具备单调性。

因此,可以二分这个子矩阵块之和的最小值,然后检查是否可以划分成至少a条,每条至少b块,

如果可以,证明这个值还可以更大;如果不可以,证明这个值需要更小。最后得到的答案即最小值中最大的。

关键问题在于如何check,已知最小矩阵块之和x,计算是否能分成至少a条、每条至少b块?

只需要枚举每一行i、再对每一行枚举每一列j

记录新的一条的起始位置new_row,新的一列的起始位置new_col

利用前缀和,计算当前子矩阵的和s[i][j] - s[new_row - 1][j] - s[i][new_col - 1] + s[new_row - 1][new_col - 1]

只要子矩阵的和刚好大于等于x,证明可以在j处切一块,当前条的总块数累加,并更新下一块的起始位置

如果当前条总块数大于等于b,证明可以开始划分下一条,总条数累加,更新下一条的起始位置

如果总条数大于等于a,说明可以划分成功,返回true。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 505;

int w[N][N], s[N][N];
int r, c, a, b;

bool check(int x)
{
    int rows = 0, new_row = 1; //rows一共切了多少条,new_row新的一条从哪里开始
    for(int i = 1; i <= r; i++)
    {
        int cols = 0, new_col = 1; //cols当前条一共切了多少块,new_col新的一块从哪里开始
        int sum = 0; //当前块的和
        for(int j = 1; j <= c; j++)
        {
            int kuai = s[i][j] - s[new_row - 1][j] - s[i][new_col - 1] + s[new_row - 1][new_col - 1];
            if(kuai >= x) //贪心找到一个大于等于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 = -1;
    while(left <= right)
    {
        int mid = left + right >> 1; //二分巧克力屑数最少的块的值
        if(check(mid)) 
        {
            ans = mid;
            left = mid + 1;
        }
        else right = mid - 1;
    }
    cout << ans;
    return 0;
}

 

标签:rows,int,洛谷题,矩阵,Brownie,Slicing,new,col,row
From: https://www.cnblogs.com/jcwy/p/18332385

相关文章

  • 洛谷题单指南-前缀和差分与离散化-P2004 领地选择
    原题链接:https://www.luogu.com.cn/problem/P2004题意解读:在一个n*m的矩阵中,找到边长为c的正方形,使得正方形范围内的数之和最大,输出正方形的左上角坐标。解题思路:二维前缀和的简单应用第一步:计算二维前缀和第二步:枚举边长为c的正方形左上角,计算正方形区域的数之和,更新答案第......
  • 洛谷题单指南-前缀和差分与离散化-P1884 [USACO12FEB] Overplanting S
    原题链接:https://www.luogu.com.cn/problem/P1884题意解读:给定n个矩形的平面直角坐标系下左上角、右下角的坐标,计算这n个矩形能覆盖的的格子数。解题思路:直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。但是!坐......
  • 洛谷题单指南-前缀和差分与离散化-P1496 火烧赤壁
    原题链接:https://www.luogu.com.cn/problem/P1496题意解读:给定n个区间[a,b),计算所有区间覆盖的总长度。解题思路:方法1、离散化先思考一种比较直观的思路:既然要计算多个区间覆盖的总长度,可以枚举每一个区间[a,b),通过一个桶数组来标记区间中所有的点f[x]=1,最终统计所有为1的......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......
  • 洛谷题单指南-前缀和差分与离散化-P2367 语文成绩
    原题链接:https://www.luogu.com.cn/problem/P2367题意解读:对于数组s[],给指定q个区间[x,y]里每个数增加z,计算操作之后最小的数。解题思路:1、暴力做法对于每一个区间[x,y],枚举给每一个数增加z,然后遍历查找最小值,总体时间复杂度为O(N^2),不可行。2、一维差分对于给指定区间[x,......
  • 洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员
    原题链接:https://www.luogu.com.cn/problem/P1314题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。解题思路:1、首先要搞懂检验值是如何计算的如上图,对于每一个区间的检验值yi,表示为:yi="该区间重量>=W的矿石个数" ✖️"该区间>=W的矿石价值之和"检验值y即所有yi(1<=......
  • 洛谷题单指南-前缀和差分与离散化-P8218 【深进1.例1】求区间和
    原题链接:https://www.luogu.com.cn/problem/P8218题意解读:对于数组a[N],给定m个区间l~r,求每个区间所有元素之和。解题思路:先思考暴力做法:对于每一个区间[l,r],累加a[l]~a[r]所有元素,时间复杂度最坏为10^5*10^4,不可行。一维前缀和:设s[N]是a[N]的前缀和数组,即对于每一个s[i......
  • [NOIP2008 提高组] 笨小猴(洛谷题号P1125)
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的......
  • Python: slicing
     #pythonslicing和函数range差不多,起始值,最后值,步长值a='abcdefghijklmnopqrstuvwxyz'print(a[:],end='\n')#abcdefghijklmnopqrstuvwxyzprint(a[:5],end='\n')#abcdeprint(a[:-1],end='\n')#abcdefghijklmnopqrstuvwxy......
  • 洛谷题单指南-动态规划3-P1220 关路灯
    原题链接:https://www.luogu.com.cn/problem/P1220题意解读:按坐标顺序排列1~n个路灯,每个路灯有不同的功耗,老张从位置c开始关灯,第一时间关掉c位置的灯,每次关掉一个灯之后,可以往右走、也可以往左走关下一个灯,老张速度是1m/s,求所有灯都关掉所消耗的最少功耗。解题思路:由题意分析,关......