CCF 202104-2:邻域均值--C++

#include<iostream>
#include<bits/stdc++.h>using namespace std;int A[601][601];
int n;//长宽都为n个像素double FindNeighborSum(int i,int j,int r,int A[][601])
{int sum=0;//像素和 int gs=0;//领域 中的像素个数 for(int x=i-r;x<=i+r;x++)//找到每一个领域像素点 {for(int y=j-r;y<=j+r;y++){if(x>=0&&x<n){if(y>=0&&y<n){sum+=A[x][y];gs++;}}}}double result=(double)sum/gs;//要用double不能用int,不然等于t的数量会变多 return result;//
}int main()
{int L;//像素的取值范围int r;//领域的范围int t;//阈值,当领域内的均值小于或等于阈值t时是较暗区域cin>>n>>L>>r>>t;for(int i=0;i<n;i++){for(int j=0;j<n;j++)cin>>A[i][j];}int sum=0;//记录较暗区域个数 for(int i=0;i<n;i++){for(int j=0;j<n;j++)//对每一个像素点分析 {if(FindNeighborSum(i,j,r,A)<=t) sum++;}}cout<<sum;return 0;
}
暴力求解:70分,要返回一个double类型的值,不然的话有些不是较暗区域的点也会被计为较暗区域

原本我想 分区域来运算,当邻域像素点个数为最大值(2*r+1)*(2*r+1)时用二维差分,否则用暴力

但是还是会超时

#include<iostream>
#include<bits/stdc++.h>using namespace std;int A[601][601];
int n;//长宽都为n个像素int d[601][601];//记录(i,j)点的前缀和 double FindNeighborSum(int i,int j,int r,int A[][601])
{int suml=0;//像素和 int gs=0;//领域 中的像素个数 for(int x=i-r;x<=i+r;x++)//找到每一个领域像素点 {for(int y=j-r;y<=j+r;y++){if(x>=0&&x<n){if(y>=0&&y<n){suml+=A[x][y];gs++;}}}}double result=(double)suml/gs;//要用double不能用int,不然等于t的数量会变多 return result;//
}int main()
{int L;//像素的取值范围int r;//领域的范围int t;//阈值,当领域内的均值小于或等于阈值t时是较暗区域memset(d,0,sizeof d);//将d清零 cin>>n>>L>>r>>t;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>A[i][j];d[i][j]=d[i][j-1]+d[i-1][j]-d[i-1][j-1]+A[i][j]; //cout<<d[i][j]<<endl;}}int sum=0;//记录较暗区域个数 int NeighborSum=0;//记录邻域中像素数值之和 double NeighborAvg=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++)//对每一个像素点分析 {	if(i-r>=0&&i+r<n&&j-r>=0&&j+r<n)//分区域来运算,当邻域像素点个数为最大值(2*r+1)*(2*r+1)时用差分,否则用暴力{NeighborSum=d[i+r][j+r]-d[i+r][j-r-1]-d[i-r-1][j+r]+d[i-r-1][j-r-1];NeighborAvg=(double)NeighborSum/((2*r+1)*(2*r+1));if(NeighborAvg<=t) sum++;}else{//邻域的上下左右有些地方不全 if(FindNeighborSum(i,j,r,A)<=t) sum++;	  } }}cout<<sum;return 0;
}

从上面的分区域到下面的满分优化,关键是怎么得到邻域的像素点个数,上面的分区域方法如果所判断的像素点(i,j)的邻域没有缺少,即邻域像素点个数达到最大(2*r-1)*(2*r-1),如果(i,j)的邻域不完整,那就暴力的一个一个判断使得gs++来得到邻域中像素点的个数。

可以通过邻域的上下左右来求得邻域中像素点的个数

如图,如果此时红色笔圈起来的数7是当前判断到的像素,设为(i,j),r=2, 那么(i,j)的邻域就应该是如图画的正方形,红色直线=left=j-r;  橙色直线=right=j+r ,蓝色直线=top=i-r;绿色直线=buttom=i+r;

所以这个邻域中像素点的个数 等于 (right-left+1)*(buttom-top+1)

这是理想的情况,即邻域是完整的

当邻域不完整时,应该通过判断来调整上下左右的取值,但是像素点个数求法还是一样的

              if(i-r<0)//上边不够
                top=0;
                else//上边够那么可能下边不够 
                {
                if(i+r>=n)//下边不够 
                buttom=n-1;    
                }
                
                
                if(j-r<0)//左边不够
                left=0;
                else      
                if(j+r>=n)//右边不够
                right=n-1; 

再用前缀和来求解一个区域中像素点的数值和


优化:用二维差分,记录一下我的第一次自己优化 

#include<iostream>
#include<bits/stdc++.h>using namespace std;int A[601][601];
int n;//长宽都为n个像素int d[601][601];//记录(i,j)点的前缀和 int main()
{int L;//像素的取值范围int r;//领域的范围int t;//阈值,当领域内的均值小于或等于阈值t时是较暗区域memset(d,0,sizeof d);//将d清零 cin>>n>>L>>r>>t;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>A[i][j];d[i][j]=d[i][j-1]+d[i-1][j]-d[i-1][j-1]+A[i][j]; //cout<<d[i][j]<<endl;}}int sum=0;//记录较暗区域个数 int NeighborSum=0;//记录邻域中像素数值之和 double NeighborAvg=0;int Neighbor=0;//记录邻域中像素个数 int left=0,right=0,top=0,buttom=0;//记录邻域的上下左右,方便计数 for(int i=0;i<n;i++){for(int j=0;j<n;j++)//对每一个像素点分析 {//首先将邻域当作理想情况,后面通过判断再调整top=i-r;buttom=i+r;left=j-r;right=j+r;if(i-r<0)//上边不够top=0;else//上边够那么可能下边不够 {if(i+r>=n)//下边不够 buttom=n-1;	}if(j-r<0)//左边不够left=0;else	  if(j+r>=n)//右边不够right=n-1; Neighbor=(buttom-top+1)*(right-left+1); //邻域中像素点个数 NeighborSum=d[buttom][right]-d[buttom][left-1]-d[top-1][right]+d[top-1][left-1];//cout<<NeighborSum<<endl;NeighborAvg=(double)NeighborSum/Neighbor;if(NeighborAvg<=t) sum++;} }cout<<sum;return 0;
}

我自己的理解,之前看过一篇特别好的差分法的文章,可惜找不到了

差分法就是在输入的时候求得对应位置的前缀和,当你需要对某个区间或区域进行加减时不用一个一个加减,直接对前缀和数组操作

一维差分:
int n=10;
for(int i=0;i<n;i++)
{
cin>>A[i];
d[i]=d[i-1]+A[i];//前缀和数组,代表第i位以及前面所有数据的和
}//对[1,5]的数据全部加1
d[1]+=1;
d[5]-=1;//只需要对区间两端的前缀和数组进行操作即可
//A[i]=d[i]-d[i-1];//得到新的加一之和的值

例题:非零段划分202109-2 非零段划分--C++-CSDN博客    

二维差分:
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>A[i][j];
d[i][j]=d[i][j-1]+d[i-1][j]-d[i-1][j-1]+A[i][j];
}
}

当i=3,j=3时,d[i][j]就是如图左上角的所有数之和

这样我们通过输入就可以得到每一个数的二维前缀和,当我们想要求一个区域的所有数之和(在本题中相对于求邻域中的所有数值之和),当我们想要求红色区域的所有数之和,可以用黄色区域所有数之和即d[4][5],减去蓝色区域所有数之和即d[4][2],再减去粉色区域所有数之和即d[1][5],重复减去的区域要加回来,加上d[2][2],就可以得到想要求的区域的所有数之和

差分法~超详细(公式+原理+例题)-CSDN博客

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

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

相关文章

uniapp实战 —— 自定义顶部导航栏

效果预览 下图中的红框区域 范例代码 src\pages.json 配置隐藏默认顶部导航栏 "navigationStyle": "custom", // 隐藏默认顶部导航src\pages\index\components\CustomNavbar.vue 封装自定义顶部导航栏的组件&#xff08;要点在于&#xff1a;获取屏幕边界…

C语言-WIN32API介绍

Windows API 从第一个32位的Windows开始就出现了&#xff0c;就叫做Win32API.它是一个纯C的函数库&#xff0c;就和C标准库一样&#xff0c;使你可以写Windows应用程序过去很多Windows程序是用这个方式做出来的 main()? main()成为C语言的入口函数其实和C语言本身无关&…

matlab信号分选系统算法-完整算法结构

matlab信号分选系统算法 针对得到的脉冲流PDW进行信号分选&#xff0c;包括重频恒定、重频抖动、重频参差和重频滑变四种脉间调制类型。   这里我们先进行数据的仿真&#xff0c;后续边仿真边分享思路&#xff1a;首先根据信号类型&#xff0c;分别产生重频恒定、重频抖动、重…

使用Nodejs搭建简单的web网页并实现公网访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 使用Nodejs搭建简单的web网页并实现公网访问 前些天发现了一个巨牛的人工智能学习网站&#xff…

docker-compose容器编排(单机一键拉起所有容器)

1、安装docker-compose实验 安装完成 2、yaml文件 &#xff08;1&#xff09;定义 一种直观的、以竖列形式展示序列化数据格式的标记语言&#xff0c;可读性高。类似于json格式&#xff0c;但语法简单 yaml通过缩进表示数据结构&#xff0c;连续的项目用-减号表示 &#x…

Excel: Python 如何干掉 VBA 系列 乙

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/k2XtfXS3GUt4r2QhizMOVg 创建工作表格 创建表格 xlwings 就可以协助创建插入了宏的 excel 表格。 先找到一个心满意足的目录&#xff0c;一般我…

Tcon基础知识

1、TCON&#xff0c;就是 Timing Controller 的缩写。从主芯片输出的要在 TFT 显示屏上显示的数据&#xff0c;在经过 TCON 模块后可以变换生成 Panel 可以直接利用的 DATA 信号和驱动器&#xff08;包括 source driver 和 gate driver&#xff09;的控制信号。 TV 市场上 TCO…

python-爬取壁纸

代理池的&#xff0c;防止IP 被封 找到图片真实地址 现在看到的只是图片的预览地址 (previews) 1.检查&#xff1a; 2.鼠标变为箭头时查看网页源代码 关于怎样在源代码中找到图片的真实地址 ??? 为什么在源代码界面 ctrl f 时候搜索的是 .png ??? 首先图片地址是以 .j…

恢复出厂设置后在 Android 上恢复照片的 6 种常用方法

恢复出厂设置可帮助您删除电子设备的所有信息并将其恢复到原始系统状态。但是&#xff0c;如果您不小心按下了恢复出厂设置按钮并从 Android 设备中删除了所有难忘的照片&#xff0c;该怎么办&#xff1f;好吧&#xff0c;您无需担心&#xff0c;因为可以通过以下一些方法来恢复…

Unity中Shader URP的安装与设置

文章目录 前言一、URP安装1、Window -> Project Manager -> 搜索 Render 二、URP设置1、创建一个URP配置文件2、渲染管线的修改&#xff08;当为空时&#xff0c;使用的是 BuildIn Render Pipeline&#xff09;3、这时我们新建一个对象。使用的材质球默认使用 URP 默认Sh…

UI设计中的肌理插画是什么样的?

肌理插画本质也和扁平插画差不多&#xff0c;相较扁平插画&#xff0c;肌理插画的层次感、细节更多&#xff0c;也会更立体生动。 肌理插画风格没有描边线&#xff0c;画面轻快&#xff0c;通过色块的明暗来区分每个元素&#xff0c;有点像色彩版的素描&#xff0c;但更简单&a…

第一个“hello Android”程序

1、首先安装Android studio&#xff08;跳过&#xff09; Android Studio是由Google推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于Android应用程序的开发。它是基于JetBrains的IntelliJ IDEA IDE构建的&#xff0c;提供了丰富的功能和工具&#xff0…

计算机视觉(P2)-计算机视觉任务和应用

一、说明 在本文中&#xff0c;我们将探讨主要的计算机视觉任务以及每个任务最流行的应用程序。 二、图像内容分类 2.1. 图像分类 图像分类是计算机视觉领域的主要任务之一[1]。在该任务中&#xff0c;经过训练的模型根据预定义的类集为图像分配特定的类。下图是著名的CIFAR…

【虹科分享】基于Redis Enterprise,LangChain,OpenAI 构建一个电子商务聊天机器人

如何构建你自己的商务聊天机器人&#xff1f;注意哦&#xff0c;是你自己的聊天机器人。一起来看看Redis Enterprise的向量检索是怎么帮你实现这个愿望的吧。 鉴于最近人工智能支持的API和网络开发工具的激增&#xff0c;似乎每个人都在将聊天机器人集成到他们的应用程序中。 …

vue中预览pdf的方法

使用vue-pdf 备注&#xff1a;这里只介绍了一页的pdf <div class"animation-box-pdf"><pdf :src"http://xxxx" /> </div>import Pdf from vue-pdf // src可以是文件地址url&#xff0c;也可以是文件流blob&#xff08;将blob转成url&a…

Python编程进阶:轻松掌握多线程和多进程

大家好&#xff0c;今天我们将讨论如何利用Python执行多线程和多进程任务。它们提供了在单个进程或多个进程之间执行并发操作的方法&#xff0c;并行和并发执行可以提高系统的速度和效率。在讨论多线程和多进程的基础知识之后&#xff0c;我们还将讨论使用Python库实现它们的实…

HarmonyOS4.0从零开始的开发教程12给您的应用添加弹窗

HarmonyOS&#xff08;十&#xff09;给您的应用添加弹窗 概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种…

智慧路灯杆如何实现雪天道路安全监测

随着北方区域连续发生暴雪、寒潮、大风等气象变化&#xff0c;北方多地产生暴雪和低温雨雪冰冻灾害风险&#xff0c;冬季雨雪天气深度影响人们出行生活&#xff0c;也持续增加道路交通风险。 智慧路灯杆是现代城市不可或缺的智能基础设施&#xff0c;凭借搭载智慧照明、环境监测…

跨境电商如何利用跨境客服软件提升销售额

随着全球化的推进&#xff0c;跨境电商成为了许多企业拓展市场的重要途径。然而&#xff0c;跨境电商面临着语言、文化、时差等多种挑战&#xff0c;为了提供更好的客户服务并提升销售额&#xff0c;跨境电商需要利用跨境客服软件。本文将探讨跨境电商如何利用跨境客服软件来提…

STM32的看门狗(WDG)

WDG&#xff08;Watchdog&#xff09;看门狗 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠…