题目 2659:蓝桥杯2022年第十三届省赛真题-统计子矩阵

2023-10-29

题目描述

给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大 N × M) 满足子矩阵中所有数的和不超过给定的整数 K?

输入格式

第一行包含三个整数 N, M 和 K.

之后 N 行每行包含 M 个整数,代表矩阵 A.

输出格式

一个整数代表答案。

样例输入

3 4 10

1 2 3 4

5 6 7 8

9 10 11 12

样例输出

19

提示

满足条件的子矩阵一共有 19,包含:

大小为 1 × 1 的有 10 个。

大小为 1 × 2 的有 3 个。

大小为 1 × 3 的有 2 个。

大小为 1 × 4 的有 1 个。

大小为 2 × 1 的有 3 个。

对于 30% 的数据,N, M ≤ 20. 对于 70% 的数据,N, M ≤ 100.

对于 100% 的数据,1 ≤ N, M ≤ 500; 0 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000.


思路:

一开始我们都会想到二维前缀和、四层循环暴力枚举,但果不其然肯定是超时的
#include<iostream>
#include<cstring>
using namespace std;
//考察二维前缀和
int a[520][520];
int n,m;
long long  res,k;
int main()
{
    memset(a,0,sizeof a);
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
            
        }
    }
    for(int i=1;i<=n;i++)//确定左上和右下暴力枚举
    {
        for(int j=1;j<=m;j++)
        {
            for(int u=i;u<=n;u++)
            {
                for(int v=j;v<=m;v++)
                {
                
                    int p=a[u][v]-a[i-1][v]-a[u][j-1]+a[i-1][j-1];
                    if(p<=k) res++;
                    else break;
                    
                }
            }
            
        }
    }
    cout<<res<<endl;
} 
后来借鉴了其他大佬的解法后, 发现用双指针可以优化,减小时间复杂度
用二维数组去表示了每一列的前缀和,然后通过控制上下边界和左右边界的移动来控制矩阵的大小以及它的遍历
#include<iostream>
#include<cstring>
using namespace std;
//考察二维前缀和
int a[520][520];
int n,m;
long long res,k;
int main()
{
    memset(a,0,sizeof a);
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            a[i][j]+=a[i-1][j];//表示第j列前i行的和 
            
        }
    }
    
    
    //类似于一个滑动窗口
    //i j控制滑动窗口的上下边界 l r控制滑动窗口的左右边界 
    for(int i=1;i<=n;i++)//起始的行 
    {
        for(int j=i;j<=n;j++)//终止的行 
        {
            for(int l=1,r=1,sum=0;r<=m;r++)//l表示左边界 r表示右边界 sum表示当前窗口(矩阵)块儿的和 
            {
                
                sum+=a[j][r]-a[i-1][r] ;
                while(sum>k)//保证着res所计算进去的每个矩阵个数  每个矩阵和都是不大于k的 
                {
                    sum-=a[j][l]-a[i-1][l];//要是大于了k  就保持着窗口大小不变将窗口右移
                    // 也就伴随着左边界l的移动 
                    l++;
                    
                }
                res+=r-l+1;    
            }
            
            
        }
    }
    cout<<res<<endl;
} 

我们可以通过样例来简单模拟一下

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

题目 2659:蓝桥杯2022年第十三届省赛真题-统计子矩阵 的相关文章

  • 折半查找法

    折半查找法又称为二分查找法 这种方法对待查找的列表有两个要求 1 必须采用顺序存储结构 2 必须按关键字大小有序排列 算法思想 首先 将表的中间位置记录的关键字与查找关键字比较 如果两者相等 则查找成功 否则利用中间位置记录将表分成前 后两
  • Lightmap3ds

    https github com Gamieon Lightmap3ds

随机推荐

  • 物联网体系的三层结构功能和包含设备

    物联网体系的三层结构 综合国内各权威物联网专家的分析 将物联网系统划分为三个层次 感知层 网络层 应用层 并依此概括地描绘物联网的系统架构 感知层 感知层解决的是人类世界和物理世界的数据获取问题 由各种传感器以及传感器网关构成 该层被认为是
  • Mybatis批量更新的两种方式

    前言 在使用Mybatis框架的过程中 经常会通过构建动态SQL来处理批量插入 批量更新数据等相关操作 本文将以批量更新为例 简单介绍其使用过程 动态SQL元素 if set trim foreach 批量更新 映射方法 int updat
  • 模式分类识别

    模式分类识别 RF随机森林多特征分类预测及变量重要度衡量 Matlab完整程序 目录 模式分类识别 RF随机森林多特征分类预测及变量重要度衡量 Matlab完整程序 预测结果 基本介绍 程序设计 参考资料 预测结果
  • SNMP V1 V2 V3版本的联系和区别 .

    SNMP 是一个协议用来管理网络上的节点 包括工作站 路由器 交换机 集线器和其他的外围设备 SNMP是一个应用协议 使用UDP封装进行传输 UDP是一个无连接的传输层协议 在OSI模型中为第四层协议 提供简单的可靠的传输服务 SNMP使网
  • JavaScript replace字符串替换函数的用法

    replace 语法 stringObj replace rgExp replaceText stringObj 必选项 要执行该替换的 String 对象或文字 该对象不会被 replace 方法修改 rgExp 必选项 描述要查找的内容
  • json-lib使用,JSONObject和JSONArray

    原文 http blog csdn net yangbobo1992 article details 8350765 从Object到String 要先用Object对象构造一个JSONObject或者JSONArray对象 然后调用它的t
  • 活动回顾|8月中文社区面对面

    导语 8 月 18 号 Jina AI 举办了 中文社区面对面 活动 本文为分享回顾 1 CLIP as service 比 CLIP 多了哪些更好用的功能 2 Finetuner 的介绍和示例 3 社区明星项目的开发体验和心得 没来得及参
  • layui表单监听下拉选择

    表单监听下拉选择 字符串转数组 var strs new Array 定义一数组 strs data value split 字符分割 form on select test function data suppsID empty cons
  • 龙尚4g模块U9300C在rk3368移植适配记录

    一 模块连接 4g模块在系统中的连接 4g模块是以usb外设的形式进行操作的 二 调试移植过程 1 准备工作 驱动加入 VID 和 PID 根据模块产品型号在 kernel drivers usb serial option c 中 加入
  • DENIED Redis is running in protected mode because protected mode is enabled

    DENIED Redis is running in protected mode because protected mode is enabled 通过客户端 包括redis cli或jedis等方式 连接Redis实例时 出现如下错误
  • 云孚开源情报系统YFINT

    一 YFINT简介 开源情报 Open Source Intelligence 简称OSINT 是指通过分析公开渠道信息所获得的情报 美国 情报分析之父 谢尔曼 肯特曾指出 80 以上的情报都是开源情报 大数据时代信息爆炸式增长 使开源情报
  • python代码——计算披萨大小

    题目 小明楼下新开了两家披萨店 价格都一样 不同的是A家披萨店的披萨是圆形 B家披萨店的披萨是三角形 为了知道 哪家披萨店的披萨面积更大一些 于是就找到你咯 你来帮帮他吧 测试数据包括四个整数 第一个整数是A家披萨店披萨的半径 第二 三 四
  • 多GPU运行PyTorch报错dimension specified as 0 but tensor has no dimensions

    错误信息 dimension specified as 0 but tensor has no dimensions 问题原因 CrossEntropyLoss的输入必须为tensor 不能为scalar 标量 即输入的数据维度不能为Non
  • 编辑器未包含main类型解决方法

    将文件移到 src 这个 Java Source Folder 下面去 现在在外面的 java 文件不会被当成一个需要编译的类 eclipse 不会编译 Java Source Folder 外面的任何 java 文件
  • 单片机通过串口给控制器发送 16进制整数,控制灯带点亮

    直接发送单个字符就可以了 unsigned char a 16 0x5E 0x5F 0xA0 0x01 0x00 0x00 0x0C 0x04 0x00 0x01 0x02 0x00 0x00 0x00 0x5A 0xFE 5E 5F A0
  • BUUCTF WEB笔记之[极客大挑战2019] EasySQL、LoveSQL、BabySQL、HardSQL

    小白一个 记录一下解题过程 如有错误请指正 一 EasySQL 1 这里我们使用一句话万能密码就可以了 记得加上 1 or 1 1 2 登录就可以拿到flag 二 LoveSQL 网页里说用sqlmap是没有灵魂滴 但是还是手痒试了一下 发
  • OC门和OD门概念

    OC门和OD门概念 OC门和OD门 OC 集电极开路 Open Collector OD 漏极输出 Open Drain OC门和OD门是相对于两个器件而言的 OC门是对三极管而言 OD门是对场效应管而言 OC门电路如下所示 Input信号
  • 【计算机毕业设计】74.家教平台系统源码

    一 系统截图 需要演示视频可以私聊 摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快
  • java storm是干什么的_实时计算入门篇-了解storm

    离线计算 最近在了解离线系统 根据自己的了解 以及参考网上的相关资料 总结了相关知识 供刚入门的同学们了解 离线计算 就是批量获取数据 批量传输数据 周期性批量计算数据 数据展示 相信大家在了解实时计算的时候肯定对离线计算有一定的了解了 比
  • 题目 2659:蓝桥杯2022年第十三届省赛真题-统计子矩阵

    题目描述 给定一个 N M 的矩阵 A 请你统计有多少个子矩阵 最小 1 1 最大 N M 满足子矩阵中所有数的和不超过给定的整数 K 输入格式 第一行包含三个整数 N M 和 K 之后 N 行每行包含 M 个整数 代表矩阵 A 输出格式