【CSP】邻域均值

news/2024/11/20 7:11:01/

邻域均值

邻域均值
在这里插入图片描述
在这里插入图片描述

  • 题意比较好理解,就是算一些数字。
  • 如果采用暴力方法的话,就是用一个边长为 2∗r+12*r+12r+1 的正方形框框住大矩阵,然后遍历这个框,求出其平均值,然后移动正方形框,直到大矩阵内所有像素点都被遍历到为止。
  • 不过粗略计算其复杂度 600∗600∗100∗100=3,600,000,000600*600*100*100=3,600,000,000600600100100=3,600,000,000,显然会超时。
  • 所以此题的关键在于优化,没必要每次移动了正方形框后都去重新计算正方形框内的所有值之和,有时候(在一行或一列内移动时)正方形框在移动前后两个状态的值只相差一行或一列,这有点像滑动窗口了,移动后减去失去的那一行或列,并加上新覆盖的一行或列,这样每一次移动只需要计算一维的量,而不再是计算整个正方形框的二维的量了,这时候复杂度直接少了两个0,是36,000,00036,000,00036,000,000,显然,10710^7107 的复杂度是能通过此题的。
  • 细节:计算这种题,肯定是要在原始矩阵的周围增添若干0行的,以达到正方形框的统一性,防止在矩阵的角和边进行特殊计算,增加代码的复杂度。但是这样的话就会产生另一个难题,我增添了几行0,显然正方形框内的和很容易算,那么占了多少个原始矩阵的像素点呢?这是本题一个恶心人的地方,要计算的东西和原矩阵的像素点个数有关,而不是单纯地计算和。
  • 那么就需要继续探索某一个像素点坐标和正方形框边长参数 rrr 的关系了。显然,如果告诉我某一个像素点的坐标 (x,y)(x,y)(x,y) 和参数 rrr,我就可以计算出以这个像素点为中心的正方形框里面有多少个原矩阵的像素点的话,那么本题就可以算解决了。
  • 实际是可以找出来这个关系的。
    在这里插入图片描述
  • 假设现在正方形框的中心为像素点 (1,2)(1,2)(1,2),那么图中彩色部分表示原始矩阵中的像素点,之所以染成4种颜色,是因为像素点个数与坐标和 rrr 的关系表达式可以分成4个部分。
  • 下面直接给出公式的具体样子,具体推导应该是一目了然的,这里就不推导了。
    • 黄色部分:(min(r,n−x−1)+1)∗(min(r,n−y−1)+1)(min(r,n-x-1)+1)*(min(r,n-y-1)+1)(min(r,nx1)+1)(min(r,ny1)+1)
    • 绿色部分:min(r,x)∗(min(r,n−y−1)+1)min(r,x)*(min(r,n-y-1)+1)min(r,x)(min(r,ny1)+1)
    • 蓝色部分:min(r,y)∗(min(r,n−x−1)+1)min(r,y)*(min(r,n-x-1)+1)min(r,y)(min(r,nx1)+1)
    • 红色部分:min(r,x)∗min(r,y)min(r,x)*min(r,y)min(r,x)min(r,y)
  • 注意这里的 xxxyyy 是行号和列号,而不是什么直角坐标系里面的横纵坐标。
  • 有了上述的关系式,那么此题基本算是解决了。
  • 下面直接给出代码
代码如下
#include <iostream>
#include <vector>
using namespace std;void solve() {int n = 0, L = 0, r = 0, t = 0;  // 题目变量scanf("%d%d%d%d", &n, &L, &r, &t);// 在原矩阵周围添加冗余的r行0vector<vector<int>> a(2 * r + n, vector<int>(2 * r + n, 0));// 用于存储所有的正方形框里的和vector<vector<int>> sums(n, vector<int>(n, 0));// 读入,注意起始位置for (int i = r; i < r + n; i++) {for (int j = r; j < r + n; j++) {scanf("%d", &a[i][j]);}}// 先计算出第一个正方形框的和,后续才好移动for (int i = 0; i < 2 * r + 1; i++) {for (int j = 0; j < 2 * r + 1; j++) {sums[0][0] += a[i][j];}}// 先向下移动,为每一行开个头,之后再对每一行进行移动for (int i = r + 1; i < r + n; i++) {sums[i - r][0] =sums[i - r - 1][0];  // 这一行格子的初值是上一行对应格子的值for (int j = 0; j < 2 * r + 1; j++) {sums[i - r][0] -= a[i - r - 1][j];  // 减去离开的那一行sums[i - r][0] += a[i + r][j];      // 加上新覆盖的那一行}}// 对每一行进行移动// 当然也可以把上面的代码合在这里面,不过那样代码很难看,何必呢。for (int i = 0; i < n; i++) {for (int j = r + 1; j < n + r; j++) {sums[i][j - r] = sums[i][j - r - 1];for (int k = 0; k < 2 * r + 1; k++) {sums[i][j - r] -= a[i + k][j - r - 1];sums[i][j - r] += a[i + k][j + r];}}}// 定义存储答案的变量和一个临时变量int ans = 0, tt = 0;// 遍历"和矩阵",计算区域个数for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {// 计算像素点个数tt = (min(r, n - i - 1) + 1) * (min(r, n - j - 1) + 1) +min(r, i) * (min(r, n - j - 1) + 1) +min(r, j) * (min(r, n - i - 1) + 1) + min(r, i) * min(r, j);// 知道了像素点个数后,也不是用和去除以像素点个数来计算平均值,而是使用乘法来判断// 符合题意就加入答案ans += (tt * t >= sums[i][j]);}}// 输出即可printf("%d\n", ans);
}int main(void) {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);solve();// fclose(stdin);// fclose(stdout);return 0;
}

http://www.ppmy.cn/news/8699.html

相关文章

MySql底层索引原理

前言 我们都知道MySql索引效率很高&#xff01;那其中的原理是什么呢&#xff1f;先跑出个问题来&#xff1a;二叉树、红黑树&#xff08;二叉平衡树&#xff09;、BTree&#xff08;平衡多叉树&#xff09;、Btree这几种类型中哪一种是mysql索引所选择的呢&#xff1f; 这个…

更新和删除数据

目录1、更新数据2、根据其他表更新数据3、 删除数据4、根据其他表删除数据对于不加WHERE条件的UPDATE和DELETE要格外谨慎&#xff01; 1、更新数据 1.1 更新全部数据&#xff1a;使用UPDATE关键字。语法如下&#xff1a; UPDATE 表名 SET 字段名新的值; 比如&#xff0c;更新学…

寒假每日一题W1D3——上课睡觉

题目描述 有 N 堆石子&#xff0c;每堆的石子数量分别为 a1,a2,…,aN。 你可以对石子堆进行合并操作&#xff0c;将两个相邻的石子堆合并为一个石子堆&#xff0c;例如&#xff0c;如果 a[1,2,3,4,5]&#xff0c;合并第 2,3 堆石子&#xff0c;则石子堆集合变为 a[1,5,4,5]。…

【攻防世界】Web warmup

知识点讲解 这一题主要是利用了include的特性 如果include的文件名中含有“/”&#xff0c;那么它会识别其为一个带目录的文件&#xff0c;只有最后一个“/”后的字符串对应的文件会被包含&#xff0c;而前面的字符串都只是在指定目录 意思是&#xff0c;如果我们的payload是这…

Qt第五十五章:Qt Design Studio设计登录页并打包到python运行

目录 一、Qt Design Studio 二、导出所有文件到QRC&#xff08;不要改动默认的QRC文件名称&#xff09; 三、QRC转换成py 1.删除Constants.qml中的 2.将App.qml和Screen01.qml中的 3.转换 4、将QRC文件和转换后的py文件&#xff0c;复制到python项目中使用。 一、Qt Des…

转换通达信分钟数据,包括5分钟和1分钟数据

目录 1 前言 2 操作演示 3 代码 4 软件下载 5 stockpy整体功能介绍 1 前言 真正的市场高手不但要熟练掌握日线&#xff0c;对分钟线也要进行深入研究。缠中说禅在他的博客中讲到&#xff0c;年、季、月、周、日、60分钟、30分钟、5分钟、1分钟研究道理是相同的。粒度越细&…

20230102单独编译Toybrick的TB-RK3588X开发板的Android12的内核

20230102单独编译Toybrick的TB-RK3588X开发板的Android12的内核 2023/1/2 17:40 《RK3588_Android12_SDK_Developer_Guide_CN.pdf》 原厂的开发板rk3588-evb1-lp4-v10单独编译内核的方式&#xff1a; cd kernel-5.10 export PATH../prebuilts/clang/host/linux-x86/clang-r4161…

校招前端面试题集锦

JavaScript 类数组对象的定义&#xff1f; 一个拥有 length 属性和若干索引属性的对象就可以被称为类数组对象&#xff0c;类数组对象和数组类似&#xff0c;但是不能调用数组的方法。常见的类数组对象有 arguments 和 DOM 方法的返回结果&#xff0c;还有一个函数也可以被看作…