【CSP试题回顾】202104-2-邻域均值(优化)

CSP-202104-2-邻域均值

关键点:二维前缀和数组

详见:

  • 【CSP考题扩展】前缀和/差分练习
  • 【CSP考点回顾】二维前缀和数组(代码实现)

解题思路

1.输入和初始化

  • 首先,程序从输入中获取四个整数n(矩阵的大小),L(像素亮度的上限),r(局部区域的半径)和t(暗像素判定阈值)。初始化一个n x n的二维数组pic来存储输入的图像数据(每个像素的亮度值)。

2.构建二维前缀和数组:

  1. 初始化前缀和数组:

    • 首先,initPrefixSum函数创建一个大小为(n+1) x (n+1)的新数组prefixSum,所有元素初始化为0。这个大小比原图像多一行和一列是为了方便边界情况的处理,避免在计算时出现索引越界。
    • 这个额外的行和列代表的是边界外的空区域,其前缀和自然为0。
  2. 填充前缀和数组:

    • 然后,函数遍历原始的图像数组pic。对于图像中的每个像素(i-1, j-1)(因为我们的prefixSum是从1开始计数的,所以原图像的第一个元素对应于prefixSum(1, 1)),更新prefixSum数组。
    • 更新规则如下:prefixSum[i][j]的值等于当前元素matrix[i - 1][j - 1](即原图像的当前像素亮度值),加上左侧元素的前缀和prefixSum[i][j-1],加上上方元素的前缀和prefixSum[i-1][j],再减去左上角元素的前缀和prefixSum[i-1][j-1],因为它被加了两次。
    • 通过这种方式,每个prefixSum[i][j]代表了原始图像左上角到(i-1, j-1)形成的矩形区域的所有像素亮度之和。

3.判断暗像素:

  1. 遍历图像中的每个像素:

    • isDark函数用于确定一个像素是否“暗”。对于图像中的每个像素(i, j),函数计算以该像素为中心,边长为2r+1的局部区域内所有像素的平均亮度。
    • 要考虑边界条件,即当像素位于图像的边缘时,实际的局部区域可能小于2r+1。因此,实际的局部区域边界由max(0, i - r)max(0, j - r)min(n - 1, i + r)min(n - 1, j + r)确定。
  2. 计算局部区域亮度平均值:

    • 使用前缀和数组,可以快速计算局部区域的总亮度:这是通过查询前缀和数组中相应角落的值并应用矩形区域和公式来完成的。
    • 计算该区域内的像素总数,即(xEnd - xStart + 1) * (yEnd - yStart + 1)
    • 计算平均亮度,即区域总亮度除以区域内的像素总数。
    • 如果这个平均亮度小于或等于阈值t,则认为中心像素是“暗”的。

4.统计和输出结果

  • 在遍历过程中,统计被认为是“暗”的像素的数量。最后,输出“暗”像素的总数。

完整代码

【100分思路-前缀和数组】

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int n, L, r, t, darkNum;
vector<vector<int>>pic, prefixSum;void initPrefixSum(vector<vector<int>>& prefixSum, const vector<vector<int>>& matrix) {int rows = matrix.size();int cols = matrix[0].size();prefixSum.resize(rows + 1, vector<int>(cols + 1, 0));for (int i = 1; i <= rows; ++i) {for (int j = 1; j <= cols; ++j) {prefixSum[i][j] = matrix[i - 1][j - 1]+ prefixSum[i - 1][j]+ prefixSum[i][j - 1]- prefixSum[i - 1][j - 1];}}
}int queryPrefixSum(const vector<vector<int>>& prefixSum, int x1, int y1, int x2, int y2) {int sum = prefixSum[x2 + 1][y2 + 1]- prefixSum[x1][y2 + 1]- prefixSum[x2 + 1][y1]+ prefixSum[x1][y1];return sum;
}bool isDark(int i, int j) {int xStart = max(0, i - r), yStart = max(0, j - r);int xEnd = min(n - 1, i + r), yEnd = min(n - 1, j + r);double sum = queryPrefixSum(prefixSum, xStart, yStart, xEnd, yEnd);double num = (xEnd - xStart + 1) * (yEnd - yStart + 1);double arg = sum / num;return arg <= t;
}int main() {cin >> n >> L >> r >> t;pic = vector<vector<int>>(n, vector<int>(n, 0));for (auto& it : pic) {for (auto& jt : it) {cin >> jt;}}initPrefixSum(prefixSum, pic); // 构建二维前缀和数组for (size_t i = 0; i < pic.size(); i++){for (size_t j = 0; j < pic[i].size(); j++){if (isDark(i, j)) darkNum++;}}cout << darkNum;return 0;
}

【70分思路-暴力枚举】

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int n, L, r, t, darkNum;
vector<vector<int>>pic;bool isDark(int i, int j) {int xStart = max(0, i - r), yStart = max(0, j - r);int xEnd = min(n - 1, i + r), yEnd = min(n - 1, j + r);double num = 0, sum = 0;for (size_t x1 = xStart; x1 <= xEnd; x1++){for (size_t y1 = yStart; y1 <= yEnd; y1++){num++;sum += pic[x1][y1];}}double arg = sum / num;return arg <= t;
}int main() {cin >> n >> L >> r >> t;pic = vector<vector<int>>(n, vector<int>(n, 0));for (auto& it : pic) {for (auto& jt : it) {cin >> jt;}}for (size_t i = 0; i < pic.size(); i++){for (size_t j = 0; j < pic[i].size(); j++){if (isDark(i, j)) darkNum++;}}cout << darkNum;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772778.shtml

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

相关文章

排序(冒泡/快速/归并)

冒泡排序 时间复杂度为 O(n^2) 原理 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]持续对越来越少的元素进行如上…

系列学习前端之第 7 章:一文掌握 AJAX

1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff08;中文名&#xff1a;阿贾克斯&#xff09;&#xff0c;就是异步的 JS 和 XML。AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。AJAX 可以在浏览器中向服务器发送异步请求…

docker拉取镜像

docker 拉取镜像 命令格式 docker pull 仓库名称[:标签] 从下载过程可以看出&#xff1a; &#xff08;1&#xff09;镜像文件是由若干层组成&#xff0c;即&#xff1a;AUFS联合文件系统。这是实现增量保存与更新的基础 &#xff08;2&#xff09;下载过程会输出各层镜像的信…

面试题-Elasticsearch集群架构和调优手段(超全面)

对于Elasticsearch&#xff08;ES&#xff09;&#xff0c;我了解并有经验。在我之前的公司&#xff0c;我们有一个相对大型的ES集群&#xff0c;以下是该集群的架构和一些调优手段的概述&#xff1a; 1. 集群架构 集群规模&#xff1a;我们的ES集群由15个节点组成&#xff0c…

水果店如何开发自己的微信小程序_新鲜生活,触手可及

水果店微信小程序&#xff1a;新鲜生活&#xff0c;触手可及 在这个快节奏的时代&#xff0c;我们都在追求更高效、更便捷的生活方式。而微信小程序&#xff0c;正是这样一个让生活变得更加轻松便捷的神奇工具。今天&#xff0c;我要向大家介绍的&#xff0c;就是一家独具匠心…

独享IP可以避免被封禁或限制访问的风险

在一些网站或服务中&#xff0c;存在对共享IP的封禁或限制访问的情况&#xff0c;这给用户带来了不便。而使用独享IP可以有效规避这一问题&#xff0c;保障用户正常访问需求。例如&#xff0c;在进行搜索引擎优化、社交媒体营销或广告投放时&#xff0c;独享IP可以确保用户的网…

window下迁移SVN仓库到新的windows服务器

一、背景 一个基于 Windows 的 SVN 服务器&#xff0c;用于管理团队的代码库。该 SVN 仓库托管着公司的软件项目&#xff0c;包括多个分支和版本的代码。我们的团队规模约为 50 人&#xff0c;分布在不同的地理位置&#xff0c;他们都依赖 SVN 仓库来进行代码版本控制和协作开…

LeetCode146:LRU缓存

leetCode&#xff1a;146. LRU 缓存 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#x…

微服务(基础篇-005-Gateway)

目录 Gateway介绍&#xff1a; 为什么需要网关&#xff08;1&#xff09; gateway快速入门&#xff08;2&#xff09; 断言工厂&#xff08;3&#xff09; 过滤器工厂&#xff08;4&#xff09; 过滤器工厂介绍及案例&#xff08;4.1&#xff09; 默认过滤器&#xff08…

IMac、Chrome、vim、pycharm的常用快捷键和常用开发工具homebrew

mac系统 陌生按键 用惯了windows的uu们&#xff08;譬如本人&#xff09;刚开始接触时可能就看不懂以下按键&#xff0c;多看几遍就好了 ⌘ (Command / Cmd) ⌥ (Option) ⌃ (control) ⇧ (shift) ⏏️ (Eject) 《关闭应用程序CommandQ》和《关闭应用界面CommandW》 comman…

C#进阶-反射的详解与应用

一、反射的概念 反射是.NET框架提供的一个功能强大的机制&#xff0c;它允许程序在运行时检查和操作对象的类型信息。通过使用反射&#xff0c;程序可以动态地创建对象、调用方法、访问字段和属性&#xff0c;无需在编译时显式知道类型信息。在.NET中&#xff0c;所有类型的信…

【STL学习】(2)string的模拟实现

前言 本文将模拟实现string的一些常见功能&#xff0c;目的在于加深理解string与回顾类与对象的相关知识。 一、前置知识 string是表示可变长的字符序列的类string的底层是使用动态顺序表存储的string对象不以’\0’字符为终止算长度&#xff0c;而是以size有效字符的个数算长…

华为openGauss数据库全面解读:数据类型一览与实战指南

引言&#xff1a; 华为openGauss数据库作为一款优秀的国产企业级数据库产品&#xff0c;其丰富多样的数据类型设计为多样化的业务场景提供了强大的数据存储与处理能力。本文将深入浅出地介绍openGauss支持的主要数据类型&#xff0c;并辅以实际应用案例&#xff0c;帮助读者更…

分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

目录 分布式系统面试全集通第一篇什么是分布式?和微服务的区别什么是分布式分布式与微服务的区别 什么是CAP?为什么不能三者同时拥有分区容错性一致性可用性 Base理论了解吗基本可用软状态最终一致性 什么是分布式事务分布式事务有哪些常见的实现方案?2PC&#xff08;Two Ph…

2024-03-26 Android8.1 px30 WI-FI 模块rtl8821cu调试记录

一、kernel 驱动&#xff0c;我这里使用v5.8.1.2_35530.20191025_COEX20191014-4141这个版本&#xff0c;下载这个版本的驱动可以参考下面的文章。 2021-04-12 RK3288 Android7.1 USB wifi bluetooth 模块RTL8821CU 调试记录_rk平台rtl8821cu蓝牙调试-CSDN博客 二、Makefile文…

vue 复制到剪切板 公共方法组件 clipboard 第一次没反应第二次成功

背景&#xff1a;使用clipboard时候想提出组件&#xff0c;后续发现第一次没反应第二次成功 原理&#xff1a;clipboard是创建一个dom监听&#xff0c;然后点击dom时候复制并触发回调函数。所以第一次点击时候是创建监听&#xff0c;第二次点击才能被监听到 解决方案&#xff1…

KY228 找位置(用Java实现)

描述 对给定的一个字符串&#xff0c;找出有重复的字符&#xff0c;并给出其位置&#xff0c;如&#xff1a;abcaaAB12ab12 输出&#xff1a;a&#xff0c;1&#xff1b;a&#xff0c;4&#xff1b;a&#xff0c;5&#xff1b;a&#xff0c;10&#xff0c;b&#xff0c;2&…

2960. 统计已测试设备

文章目录 题意思路代码 题意 题目链接 思路 设备数1&#xff0c;time1 代码 class Solution { public:int countTestedDevices(vector<int>& batteryPercentages) {int time 0;int ans 0;for (auto &i:batteryPercentages){if (i - time > 0){time;ans…

Postwoman 安装

Postwoman作为Postman的女朋友&#xff0c;具有免费开源、轻量级、快速且美观等特性&#xff0c;是一款非常好用的API调试工具。能帮助程序员节省时间&#xff0c;提升工作效率。 Github地址&#xff1a;GitHub - hoppscotch/hoppscotch: &#x1f47d; Open source API devel…

深入了解Hadoop:特性与伪分布式运行进程

引言 Hadoop是一个强大的分布式计算框架&#xff0c;它能够对大规模数据进行可靠、高效和可伸缩的处理。随着数据量的不断增长&#xff0c;企业对于处理大规模数据的需求也越来越高&#xff0c;Hadoop因此成为了大数据处理领域的首选技术。本文将深入探讨Hadoop的特性以及伪分…