蓝桥杯:统计子矩阵(十三届省赛C++组)

2023-05-16

前言:

这道题目是矩阵类型题目经典题型,解题大体思路是前缀和+双指针扫描,在我这篇博客中

第十三届蓝桥杯省赛C++B组题解_第十三届蓝桥杯b组c++答案_正在黑化的KS的博客-CSDN博客

简单提了一下大致解法,今天刷题时又遇到了一个极其相似的题型,所以写下这篇题解巩固加深记忆。

题目描述 

 

 

朴素解法 

朴素解法其实很简单,其实就是二维前缀和后暴力枚举长和宽,时间复杂度是O(n^{4}),就这个题目的数据范围而言,不能接受,当然也是可以骗点分的,具体代码很简单,这里就不赘述了。

AC解法 

首先,我们这里依然要使用前缀和的技巧,不过这里的前缀和是每列的前缀和,举个例子

g[i][j] 代表的意思是在第j列,第1行到第i行的值。 

现在我们枚举上边界和下边界,即当前枚举矩阵是处在第x行(上边界),和y(下边界)之间的。

接着枚举矩形的右端点,我们可以发现,每次当右端点向右移动的时候,矩形的面积是单调递增的,此时如果矩形的面积大于K,则不合要求,固定右端点,此时我们将当前矩形的左端点也向右移动,矩形的面积单调变小,直到举行面积再次小于K,停止移动。

那么我们怎么记录答案呢,可以发现每次移动右端点,再配合移动左端点,达到最终状态后,对于当前上下边界及左右边界的矩形而言,这次移动右端点所带来的贡献应该是 

右端点 - 左端点 + 1

因为对于现在这个右端点,向左看,从自身到右端点之间形成的矩形都是面积小于K的,因此贡献应该是左右端点之间的距离,几上面的式子

累加答案即位最终结果

代码 

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std ; 

typedef long long LL ; 

const int N = 510 ; 
int n, m, k ; 
int g[N][N] ;

int main() 
{
    ios::sync_with_stdio(false) ; 
    cin >> n >> m >> k ; 
    for (int i = 1 ; i <= n ; i ++ ) 
        for (int j = 1 ; j <= m ; j ++ )
        {
            cin >> g[i][j] ; 
            g[i][j] += g[i - 1][j] ; // 按列前缀和
        }
        
    LL res = 0 ;
    for (int x = 1 ; x <= n ; x ++ ) // 枚举上界
        for (int y = x ; y <= n ; y ++ ) // 枚举下界
            for (int i = 1, j = 1, sum = 0 ; i <= m ; i ++ ) // i为右端点,j为左端点
            {
                sum += g[y][i] - g[x - 1][i] ; 
                while (sum > k && j < i) 
                {
                    sum -= g[y][j] - g[x - 1][j] ; 
                    j ++ ; 
                }
                
                if (sum <= k) res += i - j + 1 ;
            }
            
    cout << res << endl ;

    return 0 ; 
}

最后附送大家一个相似的练习题

 3487. 最小面积子矩阵 - AcWing题库

这里给出我的AC代码以供参考,思路很类似。

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std ; 

const int N = 110, INF = 1e4 + 10 ; 
int g[N][N] ; 
int n, m, k ; 


int main() 
{
    ios::sync_with_stdio(false) ; 
    cin >> n >> m >> k ; 
    for (int i = 1 ; i <= n ; i ++ ) 
        for (int j = 1 ; j <= m ; j ++ ) 
        {
            cin >> g[i][j] ; 
            g[i][j] += g[i - 1][j] ;
        }
        
    int res = INF ; 
    for (int x = 1 ; x <= n ; x ++ ) 
        for (int y = x ; y <= n ; y ++ ) 
            for (int i = 1, j = 1, sum = 0 ; i <= m ; i ++ ) 
            {
                sum += g[y][i] - g[x - 1][i] ; 
                while (sum - g[y][j] + g[x - 1][j] >= k) 
                {
                    sum -= g[y][j] - g[x - 1][j] ; 
                    j ++ ; 
                }
                if (sum >= k) res = min(res, (y - x + 1) * (i - j + 1)) ;
            }
            
    if (res == INF) cout << -1 << endl ; 
    else cout << res << endl ;
    
    return 0 ; 
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯:统计子矩阵(十三届省赛C++组) 的相关文章

  • 数字的逆序输出

    include lt stdio h gt int main 将一个数字逆序输出 printf 34 请输入一个数字 xff1a n 34 int number scanf 34 d 34 amp number printf 34 逆转后的
  • ENSP教程---OSPF单区域配置实验

    目录 一 实验目标 二 拓扑图 三 配置基本环境 四 配置OSPF 五 修改 OSPF hello dead时间参数 七 控制OSPF xff24 R BDR的选举 八 配置信息 一 实验目标 掌握OSPF 中Router ID 的配置方法
  • Java判断回文序列

    经典的回文序列判断问题 xff0c 博主在学数据结构时遇到的一道作业题 xff0c 当时老师让用栈做的 xff0c 将我自己写的程序分享一下 xff1a 题目 xff1a 编写一个程序判别读入的字符序列是否为 回文序列 xff0c 所谓回文
  • 定义一个数组,然后从键盘输入10个整数,编程求出其最大值、最小值以及平均值(C语言)

    本程序使用了定义冒泡排序函数和定义求平均函数的方法 include lt stdio h gt include lt math h gt void Bubblesort int a int len int i j temp for j 61
  • 「Atcoder」abc242 题解

    A T shirt Code span class token keyword void span span class token function solve span span class token punctuation span
  • websocket的reconnecting-websocket的使用

    1 引用 reconnecting websocket js npm i reconnecting span class token operator span websocket 2 建立websocket ts span class t
  • nextcloud+nginx+ssl+非443,踩坑记录

    需求描述 pc 移动端app必须都支持 为了省阿里云服务器流量 xff0c 服务器需要的三个访问路径 1 需要内网可以通过ip 43 port直接访问 2 外网可以通过ddns访问 xff0c 因为443和80端口都被封 xff0c 只能换
  • 【python学习笔记】

    一 基础知识 1 字面量 xff1a 被写下来的固定的值 2 单行注释符 xff1a 单行注释内容 ps xff1a 注释符后要有个空格 3 多行注释 xff1a 34 34 34 多行注释内容 34 34 34 4 查看变量和字面量类型
  • linux命令(包含基础命令和进阶命令)大全

    拷贝 xff1a yy 删除 xff1a dd 末行 xff1a G 首行 xff1a gg 设置行号 xff1a set u 撤销 xff1a u 定位某行 xff1a 行号 shift 43 g 关机 xff1a shutdown ha
  • 汇编语言学习笔记

    一 绪论 所用教材 xff1a 汇编语言第3版 王爽老师 xff0c 清华大学出版社 1 从机器语言到汇编语言 机器语言是机器指令的集合 xff0c 汇编指令是机器指令的助记符 xff0c 汇编指令通过编译器转换成机器可以识别的01机器码
  • 机器学习笔记

    一 绪论 1 监督学习 给定一个数据集 xff0c 且已经表明了 正确答案 1 1回归问题 xff1a 预测一个连续值输出 xff1b 分类问题 xff1a 预测一个离散值输出 2 无监督学习 给定一个未表明意义的数据集 xff0c 将其分
  • C++之 try语句块和异常处理

    一 异常 异常是指存在于代码运行时的反常行为 xff0c 这些反常行为超出了函数正常执行功能的范围 xff0c 异常处理机制包括两部分的协同支持 xff1a 异常检测和异常处理 二 C 43 43 中的异常处理 在c 43 43 语言中 x
  • leetcode166题-分数到小数

    题目来源 xff1a leetcode cn 问题描述 xff1a 给定两个整数 xff0c 分别表示分数的分子 numerator 和分母 denominator xff0c 以 字符串形式返回小数 如果小数部分为循环小数 xff0c 则
  • set_new_handler(0)

    STL源码剖析 第45页中有一行代码set new handler 0 xff09 xff1a inline T allocate ptrdiff t size T std set new handler 0 T tmp 61 T oper
  • win11电脑中文用户名修改成英文用户名

    电脑的用户名是中文 xff0c 在某些软件中会产生乱码问题 xff0c 甚至无法使用的问题 xff0c 比如rabbitmq就会无法使用 这个问题可真是头疼啊 下面我就来介绍一下 xff0c win11怎么修改用户名 首先需要退出当前用户
  • 【计蒜客普及T1】T1068 救援-Java

    文章目录 一 问题描述二 格式要求1 输入格式2 输出格式 三 思路分析四 代码实例 一 问题描述 救生船从大本营出发 xff0c 营救若干屋顶上的人回到大本营 xff0c 屋顶数目以及每个屋顶的坐标和人数都将由输入决定 xff0c 求出所
  • 【Windows优化系列】Windows11安装Android子系统

    前言 Q xff1a 为什么要在Windows安装Android系统 xff1f 直接在手机使用不好吗 xff1f A xff1a 在电脑刷酷安不比拿着手机刷酷安爽吗 xff1f 在电脑版的酷安码字不比手机上码字爽吗 xff1f 不用打开手
  • 解决toolbar标题不显示问题

    问题原因 xff1a toolbar的兼容性有问题 解决办法 xff1a setSupportActionBar toolbar toolbar使用步骤 xff1a 1 编写menu xml 为了保持兼容需要这样写 xff1a androi
  • vue3.0框架Element Plus

    Element Plus 前言一 安装二 使用步骤1 完整引入2 按需导入ViteWebpack 前言 由于 Vue 3 不再支持 IE11 xff0c Element Plus 也不再支持 IE 浏览器 一 安装 span class t
  • ccf-csp 期末预测之最佳阈值

    期末预测之最佳阈值 在一开始使用了双重循环的做法 xff0c 没有考虑时间复杂度的问题 xff0c 最终虽然结果正确了 xff0c 但是提交后显示运行时间超时 xff0c 看来复杂度为n2并不满足题目的要求 之后便开始想办法降低复杂度 xf

随机推荐

  • C语言-冒泡排序 (数据结构)

    冒泡排序法 基本原理 从将要排序的对象中每次选择一个最小元素 xff08 或最大元素 xff09 xff0c 按照非递减 xff08 从小到大 xff09 xff08 或非递增 xff08 从大到小 xff09 xff09 顺序与相邻元素进
  • python中为什么需要使用“if __name__ == ‘__main__‘”语句

    首先用最简洁的语言来说明一下 if name 61 61 39 main 39 的作用 xff1a 防止在被其他文件导入时显示多余的程序主体部分 先举个例子 xff0c 如果不用 if name 61 61 39 main 39 会发生什么
  • 蓝桥杯 A+B问题(python)

    蓝桥杯A 43 B问题 我看了很多人的代码都大同小异 xff0c 所以我就做个小小的总结 xff0c 大家看完有什么更好的方法可以在评论区告诉我 问题描述 xff1a 时间限制 xff1a 1 0s 内存限制 xff1a 256 0MB 问
  • C# 输入半径,计算圆的面积和周长

    一个课下小作业 输入圆的半径 xff0c 计算圆的面积和周长输出到控制台 输出格式 xff1a 3 14用Math PI代替 代码如下 NET 5 span class token keyword using span System spa
  • 蓝桥杯 成绩统计(Python)

    题目描述 小蓝给学生们组织了一场考试 xff0c 卷面总分为 100 分 xff0c 每个学生的得分都是一个 0 到 100 的整数 如果得分至少是 60 分 xff0c 则称为及格 如果得分至少为 85 分 xff0c 则称为优秀 请计算
  • 计算存款到期后的本息合计金额

    输入年利率 存款数额 存款年限 xff0c 到期后本息合计金额 years 没有使用 xff0c 是准备做把存款日期做选择用 xff0c 但是没写 xff0c 有兴趣可以自己加 if 做选择 代码 span class token keyw
  • 从键盘输入姓名及5门课成绩

    题目 从键盘输入学生姓名及其5门课成绩 xff08 语文 xff0c 数学 xff0c 英语 xff0c 物理 xff0c 化学 xff09 xff0c 输出5门课的总成绩及平均分 方法比较笨 xff0c 首先定义变量 xff08 字符串
  • 解决虚拟机开启后字体和图标过小的问题

    运行虚拟机到开机界面在虚拟机界面 xff0c 鼠标右键 xff0c 选 属性 点 设置 到如下界面 xff1a 将屏幕分辨率调整到图片所示 xff0c 点击 确定 后 xff0c 图标即可放大 可以根据自己的需要调整像素的大小
  • 将你的电脑远程连接树莓派的简单方法

    不使用网线或者显示器 键盘 鼠标等外接设备 xff0c 即可远程建立树莓派与电脑的连接 目录 1 提前准备 1 1 准备硬件 1 2 系统镜像 1 3 准备软件 2 烧录系统 3 使用ssh连接电脑热点 4 VNC远程控制连接树莓派桌面 1
  • DMA简介

    为什么要有 DMA 技术 dma主要是用于读写数据用的 在没有 DMA 技术前 xff0c I O 的过程是这样的 xff1a CPU 发出对应的指令给磁盘控制器 xff0c 然后返回 xff1b 磁盘控制器收到指令后 xff0c 于是就开
  • c语言冒泡法对10个整数进行递增排序

    分析 xff1a 冒泡法排序的思路是 xff0c 第一次排序对n个元素从头到尾反复进行相邻两个数的比较 xff0c 将小的调到前头 xff0c 第一趟冒泡结束后 xff0c 最大的元素就是数组序列中最后一个元素 xff0c 也就是它的最终位
  • 全网最详细的openstack安装教程

    前言 相信很多安装过openstack的人都知道 xff0c openstack的安装过程很麻烦 xff0c 总是需要修改文件 xff0c 并且还有一堆报错信息 xff0c 遇到一些报错也不知道怎么去解决 xff0c 所以这次就记录并分享一
  • 前缀极差

    前缀极差 蒜头君有 n 个数 xff0c 他提出了 q 个问题 xff0c 每个问题是说 xff0c 询问前 x 个数的极差 xff08 最大值减最小值 xff09 你能帮助他解决这 q 个问题吗 xff1f 输入格式 第一行两个整数 n
  • 「数据库SQL」 ‘三小时快速入门’

    目录 写在前面 数据类型 将自动补全改为默认大写字母的方法 视频 0 xff5e 1 39 11 39 30 对应代码及笔记 删除 修改资料 获得资料 创建公司资料库表格 获取公司资料 聚合函数 万用字元 联集 连接 子查询 写在前面 本篇
  • C++:将输出结果写入文件、从文件中读取数据

    应用背景 很多时候我们会使用语句 xff1a cout lt lt lt lt endl 来进行将某个变量的值展示在屏幕上 xff0c 但如果我们希望将这个结果写入文件中 该怎样操作呢 xff1f 下面展示了如何将输出结果写入txt文件之中
  • C++:set的常用用法详解

    1 关于set C 43 43 STL 之所以得到广泛的赞誉 xff0c 也被很多人使用 xff0c 不只是提供了像vector string list等方便的容器 xff0c 更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构
  • 计算分部积分实例:t^2 * e^2t 的积分

  • 采样定理扩展结论

    已知 xff1a x t 的奈奎斯特律为 y t 的奈奎斯特率为 那么有以下结论 x t y t 时域相乘 61 gt 频谱卷积 61 gt 新信号的奈奎斯特率为和的和 x t y t 时域卷积 61 gt 频谱相乘 61 gt 新信号的奈
  • Acwing:合适数对

    今天在补AcWing周赛题目的时候遇到了一道很经典的区间和问题 xff0c 因此写下本篇博客记录下来 原题链接 xff1a 4316 合适数对 AcWing题库 题目描述 输入样例1 xff1a 5 4 5 1 3 4 1 输出样例1 xf
  • 蓝桥杯:统计子矩阵(十三届省赛C++组)

    前言 xff1a 这道题目是矩阵类型题目经典题型 xff0c 解题大体思路是前缀和 43 双指针扫描 xff0c 在我这篇博客中 第十三届蓝桥杯省赛C 43 43 B组题解 第十三届蓝桥杯b组c 43 43 答案 正在黑化的KS的博客 CS