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.mzph.cn/news/220089.shtml

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

相关文章

数据分析基础之《numpy(3)—基本操作》

一、基本操作 1、adarray.方法() 2、np.函数名() 二、生成数组的方法 1、生成0和1的数组 为什么需要生成0和1的数组&#xff1f; 我们需要占用位置&#xff0c;或者生成一个空的数组 &#xff08;1&#xff09;ones(shape[, dtype, order]) 生成一组1 shape&#xff1a;形…

NOIP2017提高组day2 - T2:宝藏

题目链接 [NOIP2017 提高组] 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图&#xff0c;藏宝图上标出了 n n n 个深埋在地下的宝藏屋&#xff0c; 也给出了这 n n n 个宝藏屋之间可供开发的 m m m 条道路和它们的长度。 小明决心亲自前往挖掘所有宝藏屋中的宝藏。但…

【沐风老师】科研绘图3DMAX病毒建模教程

3dMax在科研绘图方面也有广泛的应用&#xff0c;本教程就给大家讲解病毒的建模方法&#xff0c;下面直接进入教程&#xff1a; 3dMax病毒建模方法&#xff1a; 1.启动3dMax&#xff0c;在视口中创建一个“几何球体”。方法&#xff1a;右边命令面板->创建->几何体->…

MySQL中EXPLAIN执行计划的分析

一. 执行计划能告诉我们什么&#xff1f; SQL如何使用索引联接查询的执行顺序查询扫描的数据函数 二. 执行计划中的内容 SQL执行计划的输出可能为多行&#xff0c;每一行代表对一个数据库对象的操作 1. ID列 ID列中的如果数据为一组数字&#xff0c;表示执行SELECT语句的顺…

当当狸AR智能学习图集跨越千年文明传承,邀您“面对面”与虚拟诗人互动对诗

中华传统文化底蕴深厚&#xff0c;余韵悠长。即使经过千年的历史裂变&#xff0c;依然历久铭心慰藉着一代又一代人的灵魂。千百年后的今天&#xff0c;成为了我们独一无二的财富。 如今&#xff0c;国人学习中华传统文化的方式有很多&#xff0c;诗词集、动画影片、诗歌传颂等…

Java,这是一个模仿HashMap的put,get功能的自定义MyHashMap

Java 手写HashMap源码 一&#xff0c;手写源码 这是一个模仿HashMap的put&#xff0c;get功能的自定义的MyHashMap package cn.wxs.demo;import java.io.Serializable; import java.util.*; import java.util.function.BiConsumer; import java.util.function.BiFunction; i…

SIM初始化流程

ATR ATR(Answer To Reset)&#xff1a;复位应答信号&#xff0c;有SIM卡传输给终端&#xff0c;包括SIM卡自身的一些信息&#xff0c;比如支持的传输速率&#xff0c;传输模式等。 SIM卡的ATR代表"Answer to Reset"&#xff0c;即复位响应。当SIM卡被插入设备中时…

Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯

目录 一、字符设备驱动程序框架 编写驱动程序的步骤&#xff1a; 对于 LED 驱动&#xff0c;我们想要什么样的接口&#xff1f; LED 驱动能支持多个板子的基础&#xff1a;分层思想 二、Linux驱动如何指向一个GPIO 直接通过寄存器来操作GPIO 利用引脚号操作GPIO IMX6UL…

算法通关村第十八关-黄金挑战回溯困难问题

大家好我是苏麟 , 今天带来几道回溯比较困难的题 . 回溯有很多比较难的问题&#xff0c;这里我们看两个&#xff0c;整体来说这两个只是处理略复杂&#xff0c;还不是最难的问题 . 大纲 IP问题 IP问题 描述 : 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 …

redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板

redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象&#xff0c;引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致这个数据的每次请求都需要查DB&#xff0c;数据库压力…

# 和 $ 的区别①

# 和 $ 都是为了获取变量的值 # 和 $ 区别 : 使用 # 查询 id 为 1 的内容 如果看不懂代码,就去看<<Mybatis 的操作(结合上文)续集>>,我这里为了简练一点就不多解释了 Select("select * from userInfo where id #{id}")UserInfo selectOne(Integer id…

Hive命令操作

1.命令行模式 1. 获取帮助 --> hive -H 或-help 2. 运行hive语句 --> hive -e "执行语句" 3. 运行hive文件 --> hive –f "执行文件" 4. 定义变量 --> hive –hivevar keyvalue 5. 引用变量 --> ${varname} 2. 交互模式 1. 进入客户端 -…

【UE 材质】切换颜色、纹理时的过渡效果

效果 步骤 1. 新建一个工程&#xff0c;创建Basic关卡 2. 创建一个材质&#xff0c;这里命名为“M_Plane”&#xff0c;打开这个材质&#xff0c;在材质图表中添加如下节点 注意“Noise”节点中的函数选择“Voronoi” 3. 对材质“M_Plane”创建材质实例 4. 在场景中放置一个平…

【SpringBoot】FreeMarker视图渲染

目录 一、FreeMarker 简介 1.1 什么是FreeMarker&#xff1f; 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令 2.3.2 assign 2.3…

docker compose部署wordpress

准备机器&#xff1a; 192.168.58.151 &#xff08;关闭防火墙和selinux&#xff09; 安装好docker服务 &#xff08;详细参照&#xff1a;http://t.csdnimg.cn/usG0s 中的国内源安装docker&#xff09; 部署wordpress: 创建目录&#xff1a; [rootdocker ~]# mkdir…

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

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

【教程】查看GPU与PCIe版本和匹配速率

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] PCIe理论速度对照表 bash脚本 #!/bin/bash# 查找所有 NVIDIA GPU 设备的设备ID及其类型 device_info$(lspci | grep -i nvidia | egrep "VGA compatible controller|3D controller" | awk {print $1, …

C# WPF上位机开发(动态库dll的开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多时候&#xff0c;我们并不希望所有的程序都放到一个exe里面。因为这样相当于把所有的风险都放在了一个文件里里面&#xff0c;既不利于程序的升…

完全平方数 C语言xdoj49

问题描述 若一个整数n能表示成某个整数m的平方的形式&#xff0c;则称这个数为完全平方数。写一个程序判断输入的整数是不是完全平方数。 输入说明 输入数据为一个整数n&#xff0c;0<n<10000000。 输出说明 如果n是完全平方数&#xff0c;则输出构成这个完全…

Simple Water Caustic Pattern In Unity ShaderGpaph

shadertoy上有各种神奇的效果&#xff0c;以我的见识根本想象不到这些是怎么弄出来的。 不过不会做至少可以先会用。 这篇文章抓取一个shadertoy的示例以制作一个测试效果。 参考这篇shadertoy&#xff0c;使用自定义节点装填hlsl的noise代码 Shader - Shadertoy BETA 首先使…