首页 > 其他分享 >蓝桥杯B组统计子矩阵

蓝桥杯B组统计子矩阵

时间:2023-03-24 09:25:04浏览次数:46  
标签:前缀 int sum 矩阵 long 蓝桥 include 统计

题目传送门

题目描述

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

输入格式

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

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

输出格式

一个整数代表答案。

输入输出样例

输入 #1
3 4 10
1 2 3 4
5 6 7 8
9 10 11 12
输出 #1
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≤Aij≤1000,1≤K≤2.5×108.

蓝桥杯 2022 省赛 B 组 F 题。

解答:

常规思路,用二维前缀和的方法,时间复杂度为o(n4),如果n,m为500,显然会超时,但是可以过70%的数据。

代码:

#include<iostream>
#include<algorithm>
//时间复杂度o(n4);
using namespace std;
const int M = 600;
int ma[M][M];
int sum[M][M];//前缀和
long long ans=0;
int m, n,c;
int main()
{
	cin >> n>> m >> c;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> ma[i][j];
			sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + ma[i][j];//前缀和,没问题
		}
	}
	int a;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (ma[i][j] > c)
				break;
			for (int k = i; k <= n; k++)
			{
				if ((sum[k][j] - sum[k][j - 1] - sum[i - 1][j] + sum[i - 1][j - 1]) > c)
					break;
				for (int b = j; b <= m; b++)
				{
					a = sum[k][b] - sum[i-1][b] - sum[k][j-1] + sum[i-1][j-1];
					if (a > c)
					{
						break;
					}	
						ans++;
				}
			}
		}
	}
	cout << ans;
	return 0;
}

因为矩阵里的每一个数都是大于0的,所以当矩阵里多元素的时候,矩阵是单调递增的,所以可以考虑双指针,利用双指针来解答,二维前缀和为o(n4),会超时,所以我们可以采用一维前缀和的方法,将每一列进行前缀和,然后固定上下高度,用双指针来判断,将o(n4)降为o(n3);具体代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
const int M = 600;
int a[M][M];
int sum[M][M];
long long ans = 0;
int n, m, k;
int main()
{
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			cin >> a[i][j];
			sum[i][j] += sum[i - 1][j] + a[i][j];//一维前缀和统计每一列的;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = i; j <= n; j++)
		{
			for (int l = 1, r = 1,h=0; r <= m; r++)//双指针优化
			{
				h += sum[j][r] - sum[i - 1][r];
				while (h>k)
				{
					h -= sum[j][l] - sum[i - 1][l];
					l++;
				}
				ans +=r-l+1;
			}
		}
	}
	cout << ans;
	return 0;
}

完结!

标签:前缀,int,sum,矩阵,long,蓝桥,include,统计
From: https://www.cnblogs.com/haggard/p/17250226.html

相关文章

  • 蓝桥杯-砍竹子
    蓝桥杯2022省赛B组J题:砍竹子[蓝桥杯2022省B]砍竹子题目描述这天,小明在砍竹子,他面前有\(n\)棵竹子排成一排,一开始第\(i\)棵竹子的高度为\(h_{i}\).他觉......
  • 使用Git统计指定时间范围内新增、删除代码行数
    统计命令gitlog--author="xxx"--since='2023-03-20'--until='2023-03-21'--pretty=tformat:--numstat|gawk'{add+=$1;subs+=$2;loc+=$1-$2}END{......
  • C++编程题(蓝桥杯)
        运行结果  #include<iostream>usingnamespacestd;voidjingsai1(){//chh:水深;chs:最初水下深度;intchh=0,chs=0;intI_depth=0;cou......
  • 【动态规划】【矩阵快速幂优化】【XR-1】分块
    【XR-1】分块题目描述有一个长度为\(n\)的序列,xht37现在想分块维护它。PinkRabbit要求他只准将序列分成\(PR\)种长度的块。NaCly_Fish要求他只准将序列分成\(N......
  • 【leetcode-数组】有序矩阵中第K小的元素
    题目:给定一个 nxn 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。 示例:matrix=[......
  • 2023.3.23蓝桥杯集训·每日一题
    今日复习的内容是背包问题。记得动态规划问题的初始化。AcWing3382.整数划分解题思路考虑到本题是将一个数划分为\(2\)的幂的和,而\(2\)的\(i\)幂是可以无限使用......
  • 词云图&词频统计
    默认是精确匹配默认模式试图将句子最精确地切开,适合文本分析;a=jieba.cut("中国是一个伟大的国家")print(list(a))['中国','是','一个','伟大','的','国家......
  • 复杂度分析:如何分析、统计算法的执行效率和资源消耗
    作者:京东物流崔旭我们都知道,数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指......
  • 大数据量实时统计排序分页查询(并发数较小时)
    大数据量实时统计排序分页查询的瓶颈不是函数(count,sum等)执行,不是having,也不是orderby,甚至不是表join,导致慢的原因就在于“数据量太大本身” 化整为零就是将表划分为M......
  • 蓝桥杯之迷宫
    蓝桥杯题解迷宫下图给出了一个迷宫的平面图,其中标记为11的为障碍,标记为00的为可以通行的地方。010000000100001001110000迷宫的入口为左上角,出口为右下角,在迷......