【CSP】邻域均值

news2024/11/18 8:44:14

邻域均值

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

  • 题意比较好理解,就是算一些数字。
  • 如果采用暴力方法的话,就是用一个边长为 2 ∗ r + 1 2*r+1 2r+1 的正方形框框住大矩阵,然后遍历这个框,求出其平均值,然后移动正方形框,直到大矩阵内所有像素点都被遍历到为止。
  • 不过粗略计算其复杂度 600 ∗ 600 ∗ 100 ∗ 100 = 3 , 600 , 000 , 000 600*600*100*100=3,600,000,000 600600100100=3,600,000,000,显然会超时。
  • 所以此题的关键在于优化,没必要每次移动了正方形框后都去重新计算正方形框内的所有值之和,有时候(在一行或一列内移动时)正方形框在移动前后两个状态的值只相差一行或一列,这有点像滑动窗口了,移动后减去失去的那一行或列,并加上新覆盖的一行或列,这样每一次移动只需要计算一维的量,而不再是计算整个正方形框的二维的量了,这时候复杂度直接少了两个0,是 36 , 000 , 000 36,000,000 36,000,000,显然, 1 0 7 10^7 107 的复杂度是能通过此题的。
  • 细节:计算这种题,肯定是要在原始矩阵的周围增添若干0行的,以达到正方形框的统一性,防止在矩阵的角和边进行特殊计算,增加代码的复杂度。但是这样的话就会产生另一个难题,我增添了几行0,显然正方形框内的和很容易算,那么占了多少个原始矩阵的像素点呢?这是本题一个恶心人的地方,要计算的东西和原矩阵的像素点个数有关,而不是单纯地计算和。
  • 那么就需要继续探索某一个像素点坐标和正方形框边长参数 r r r 的关系了。显然,如果告诉我某一个像素点的坐标 ( x , y ) (x,y) (x,y) 和参数 r r r,我就可以计算出以这个像素点为中心的正方形框里面有多少个原矩阵的像素点的话,那么本题就可以算解决了。
  • 实际是可以找出来这个关系的。
    在这里插入图片描述
  • 假设现在正方形框的中心为像素点 ( 1 , 2 ) (1,2) (1,2),那么图中彩色部分表示原始矩阵中的像素点,之所以染成4种颜色,是因为像素点个数与坐标和 r r r 的关系表达式可以分成4个部分。
  • 下面直接给出公式的具体样子,具体推导应该是一目了然的,这里就不推导了。
    • 黄色部分: ( m i n ( r , n − x − 1 ) + 1 ) ∗ ( m i n ( 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)
    • 绿色部分: m i n ( r , x ) ∗ ( m i n ( r , n − y − 1 ) + 1 ) min(r,x)*(min(r,n-y-1)+1) min(r,x)(min(r,ny1)+1)
    • 蓝色部分: m i n ( r , y ) ∗ ( m i n ( r , n − x − 1 ) + 1 ) min(r,y)*(min(r,n-x-1)+1) min(r,y)(min(r,nx1)+1)
    • 红色部分: m i n ( r , x ) ∗ m i n ( r , y ) min(r,x)*min(r,y) min(r,x)min(r,y)
  • 注意这里的 x x x y y y 是行号和列号,而不是什么直角坐标系里面的横纵坐标。
  • 有了上述的关系式,那么此题基本算是解决了。
  • 下面直接给出代码
代码如下
#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行0
    vector<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.coloradmin.cn/o/133532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【免费开放源码】审批类小程序项目实战(预约审批端)

第一节&#xff1a;什么构成了微信小程序、创建一个自己的小程序 第二节&#xff1a;微信开发者工具使用教程 第三节&#xff1a;深入了解并掌握小程序核心组件 第四节&#xff1a;初始化云函数和数据库 第五节&#xff1a;云数据库的增删改查 第六节&#xff1a;项目大纲以及制…

6.5 特殊用途语言特性

文章目录默认实参使用默认实参调用函数默认实参声明默认实参初始值内联函数和constexpr函数内联函数constexpr 函数把内联函数和constexpr函数声明在头文件内调试帮助assert预处理宏NDEBUG预处理变量默认实参 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同…

电子游戏销售之缺失值检测与处理

电子游戏销售之缺失值检测与处理 文章目录电子游戏销售之缺失值检测与处理0、写在前面1、数据缺失值预处理1.1 表的形状1.2 原始数据每个特征缺失和非缺失的数目1.3 每个特征缺失的率1.4 处理后各特征缺失值的数目1.5 删除缺失值后的数据展示2、替换法处理缺失值2.1 替换法2.2 …

1.Springboot配置细节

一、参考资料 13-SpringBoot配置-项目外部配置加载顺序_哔哩哔哩_bilibili 二、配置 2.1 配置文件 注意变量后面是:&#xff0c;而不是等号 2.2 读取配置文件 2.2.1 Value 比如配置文件application.properities中定义了一个name&#xff0c;其值为abc。 代码里面只需按照如…

一、软件安装与配置

一、PyTorch环境软件安装与配置 1.安装anaconda参考 anaconda老版本下载方法&#xff08;如何查看anaconda与python版本对应关系&#xff09;及安装教程_breadth_的博客-CSDN博客_anaconda旧版本下载 2.在anconda下安装和激活pytorch环境 此步并没有下载pytorch 3.下载pyto…

云计算运营—03 KVM虚拟化技术方案介绍

KVM虚拟化技术方案介绍 1.背景介绍 KVM&#xff08;Kernel-based Virtual Machine&#xff09; 开源全虚拟化方案 支持体系结构 x86(32位,64位)、IA64、PowerPC、S390 依赖x86硬件支持&#xff1a;Intel VT-x/ AMD-V内核模块&#xff0c;使得linux内核成为hypervisor XEN架构 …

《B-树》

tips&#xff1a;B-树读成b树&#xff0c;并不是b减树 【一】基本搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索树无要求O(N)二叉平衡树&#xff08;AVL和红黑树&#xff09;无要求&#xff0c;最后随机O(log2N)哈希无要求O(1)位图无要求O…

linux系统中SPI驱动框架的基本原理与实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中SPI驱动ICM-20608六轴传感器的操作。 目录 第一&#xff1a;linux系统下SPI驱动框架简介 第二&#xff1a;SPI设备驱动编写 第三&#xff1a;SPI设备和驱动匹配过程 第一&#xff1a;linux系统下SPI驱…

MySQL数据库高级面试题(1)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

CSDN年度征文 | 你好,2023

祝大家新年快乐~&#x1f9e7;&#x1f9e7;&#x1f9e7;⭐过去的2022⭐2022已成过去&#xff0c;2023慢步向我们走来。回首2022&#xff0c;这一年不是平凡的一年。这一年&#xff0c;有苦也有乐。冬奥会的成功举办、香港回归25周年、二十大胜利召开、航天任务圆满成功等等都…

设计 | 分享5个好用的PPT模板网站

第一PPT 这个老牌的模板网站了&#xff0c;全站都是免费下载&#xff0c;还是不错的 但是素材质量嘛&#xff0c;免费所以不太高。 第一PPT下载https://www.1ppt.com/ 模板狗 这个是最近发现的一个网站&#xff0c;其中内容比较精美。 而且不用开会员也能单独购买&#x…

【Android】APT

引言&#xff1a; 安卓中APT又叫Annotation Processing Tool&#xff0c;即注解处理器。Java中注解分为编译时注解和运行时注解&#xff0c;编译时注解无法通过反射的方式进行获取和处理&#xff0c;所以我们可以利用APT处理编译时注解。比如常见的三方库ButterKnife、ARouter…

mysql删除重复记录并且只保留一条

准备的测试表结构及数据 插入的数据中A,B,E存在重复数据,C没有重复记录 CREATE TABLE tab ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT13 DEFAULT CHARSETutf8; -- --------------------…

使用root用户和普通用户完成分配任务案例 ansible(1)

目录 案例一&#xff1a; 控制主机和受控主机通过root用户通过免密验证方式远程控制受控主机实施对应任务。 案例二&#xff1a; 控制主机连接受控主机通过普通用户以免密验证远程控制受控主机实施特权指定操作。 案例一&#xff1a; 控制主机和受控主机通过root用户通过免…

<网络概述>——《计算机网络》

目录 1.网络基础 1.1 计算机网络背景 1.2 网络发展 1.3 软件分层 1.4 网络和操作系统的关系 1.5 局域网通信的原理 2. 网络协议 2.1 网络协议初识 2.1.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层(或四层)模型 3. 网络传输基本流程 3.1 网络传输流程图 3.2 数据包…

密码技术扫盲,Part 3:认证

个人博客 密码技术扫盲&#xff0c;Part 1&#xff1a;对称加密密码技术扫盲&#xff0c;Part 2&#xff1a;非对称加密&#x1f3af; 密码技术扫盲&#xff0c;Part 3&#xff1a;认证 除了加密&#xff0c;还有一类用法是对信息的认证&#xff0c;主要包括 4 个技术 单向散…

PostgreSQL JIT 实现query性能加速的一些补充

文章目录背景Executor 本身做的一些优化LLVM JIT 的优化本地以及全局优化执行 query 时的优化JIT调度优化 过程背景 之前介绍过一次 PostgreSQL JIT with LLVM 实现&#xff0c;因为有一些细节没有介绍得很清楚&#xff0c;需要额外做一些补充。 关于LLVM 的IR 以及 如何 用LL…

11.HTML颜色、HTML脚本、字符实体、URL

1.HTML颜色 1&#xff09;HTML 颜色由红色、绿色、蓝色混合而成。 2&#xff09;HTML 颜色由一个十六进制符号来定义&#xff0c;这个符号由红色、绿色和蓝色的值组成&#xff08;RGB&#xff09;。 3&#xff09;每种颜色的最小值是0&#xff08;十六进制&#xff1a;#00&…

性能优化系列之怎么让图片加载得更快?

文章の目录一、压缩png1、优势2、说明文档3、安装4、使用4.1、环境4.2、示例4.3、API4.4、还有一个第三库是对当前库的封装&#xff0c;叫jdf-png-native【版本1.1.0&#xff0c;环境同node-pngquant-native】&#xff0c;使用方法和node-pngquant-native差不多二、压缩jpg1、优…

分享68个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1QB61EsIl70vXx1yrJkiesA?pwdbup1 提取码&#xff1a;bup1 PHP源码 分享68个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载…