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

news2024/12/30 1:47:47

#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.coloradmin.cn/o/1295597.html

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

相关文章

Numpy数组的运算(第7讲)

Numpy数组的运算(第7讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

盘点11月Sui生态发展,了解Sui的近期成长历程!

11月是Web3的“回暖期”&#xff0c;行业持续展现增长趋势。Sui紧随行业脚步&#xff0c;开展了一系列生态活动。其中历时一个多月的Quest 3游戏活动顺利结束并公布奖励&#xff0c;在多地区成功举办Move和Sui生态黑客松&交流会&#xff0c;还有针对中文社区开发者教育的星…

一.初始typescript

什么是ts 首先我们要确认typescript是一个语言&#xff0c;是等同于JavaScript层级得&#xff0c;并不是一些人认为得是JavaScript得类型规范工具或者插件。 ts与js的差异 从type script这个名字就可以看出&#xff0c;ts其实是JavaScript的一个类型化超集&#xff0c;它增…

低多边形游戏风格3D模型纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

[linux] kaggle 数据集用linux下载

你可以通过以下步骤获取Kaggle的下载链接并在Linux中进行下载&#xff1a; 首先&#xff0c;确保你已经安装了Python和Kaggle API。如果没有安装&#xff0c;你可以通过以下命令安装&#xff1a; pip install kaggle 接着&#xff0c;你需要在Kaggle网站上获取API Token。登录…

大数据技术1:大数据发展简史

前言&#xff1a;学习大数据技术&#xff0c;知道会用已经够了&#xff0c;但是要想走得更远&#xff0c;应该了解它发展的来龙去脉&#xff0c;为何会有新的技术/工具的出现&#xff0c;相比老的技术有什么样的进步。 1、传统数据处理系统存在的问题 随着信息时代互联网技术爆…

重新认识Word——多级列表和项目符号

重新认识Word——多级列表和项目符号 多级列表没有运用标题样式但标题格式统一 正式公本文书项目符号和自动编号项目符号自动编号软回车重新起头开始编号解决编号与文本距离过大问题 之前我们重新认识了Word里面的样式&#xff0c;现在的情况就是&#xff0c;我的一些文字已经运…

【kubernetes】k3s集群搭建(正在更新……)

文章目录 一、k3s简介二、快速搭建1.控制平面2.镜像加速 Pod容器集1.创建和管理pod Deployment(部署)与ReplicaSet(副本集)滚动更新 Service命名空间YAML语法管理对象常用命令缩写YAML规范 声明式配置对象标签选择器 容器运行时接口(CRI)与镜像导入导出容器运行时接口(CRI) 金丝…

案例062:基于微信小程序的健身房私教预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

乔拓云平台:微信小程序开发的全新视角与高效路径

随着微信小程序的日益普及&#xff0c;越来越多的人开始关注如何开发自己的小程序。对于没有开发经验的人来说&#xff0c;借助第三方平台如乔拓云&#xff0c;可以轻松实现小程序的开发。本文将介绍微信小程序开发需要学习的东西&#xff0c;并探讨如何借助乔拓云平台进行无经…

十一、了解分布式计算

1、什么是&#xff08;数据&#xff09;计算&#xff1f; 2、分布式(数据)计算 &#xff08;1&#xff09;概念 顾名思义&#xff0c;分布式计算&#xff0c;即以分布式的形式完成数据的统计&#xff0c;得到需要的结果。 分布式数据计算&#xff0c;顾名思义&#xff0c;就是…

视频批量剪辑方法:AI智剪创新力,批量剪辑新风潮

随着数字媒体技术的不断发展&#xff0c;视频剪辑已经成为日常生活和工作中不可或缺的一部分。然而&#xff0c;对于许多非专业人士来说&#xff0c;视频剪辑仍然是一个相对繁琐和复杂的过程。AI智剪是一种基于人工智能技术的视频批量剪辑方法。它可以通过自动化和智能化的方式…

实现SQL server数据库完整性

1.创建一个数据库名为“erp” 主数据文件&#xff1a;初始容量为5MB&#xff0c;最大容量为50MB&#xff0c;递增量为1MB&#xff0c;其余参数自设。事务日志文件&#xff1a;初始容量为3MB&#xff0c;最大容量为20MB&#xff0c;递增量为10%&#xff0c;其余参数自设。 创建…

temu的产品审核结果在哪里

拼多多作为中国最大的社交电商平台之一&#xff0c;拥有众多商家和卖家在其平台上销售商品。为了确保平台上的商品质量和合规性&#xff0c;拼多多对商家所提交的商品进行审核。如果您是在拼多多的Temu平台上销售商品&#xff0c;想要查询您的产品审核结果&#xff0c;可以按照…

维普论文查重率高【详细说明】

大家好&#xff0c;今天来聊聊维普论文查重率高&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 维普论文查重率高&#xff1a;原因分析与降重技巧 背景介绍 在学术领域&#xff0c;论文的重复率是衡量其…

计算机视觉之手势、面部、姿势捕捉以Python Mediapipe为工具

计算机视觉之手势、面部、姿势捕捉以 Python Mediapipe为工具 文章目录 1.Mediapipe库概述2.手势捕捉(hands)3.面部捕捉(face)4.姿势捕捉(pose) 1.Mediapipe库概述 Mediapipe是一个开源且强大的Python库&#xff0c;由Google开发和维护。它提供了丰富的工具和功能&#xff0c…

【开源】基于Vue和SpringBoot的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

Vue脚手架 生命周期 组件化开发

Vue脚手架 & 生命周期 & 组件化开发 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔…

Python与ArcGIS系列(十五)根据距离抓取字段

目录 0 简述1 实例需求2 arcpy开发脚本0 简述 在处理gis数据的时候,会遇到这种需求:将一个图层与另一个图层中相近的要素进行字段赋值。本篇将介绍如何利用arcpy及arcgis的工具箱实现这个功能。 1 实例需求 为了介绍这个功能的实现,我们需要有一个特定的功能需求。在这里选…

ssm在线选课系统微信小程序项目分享

学生小程序端的主要功能有&#xff1a; 1.用户注册和登陆系统 2.查看选课介绍信息 3.查看查看课程分类 4.查看课程详情&#xff0c;在线选课&#xff0c;提交选课信息 5.在线搜索课程信息 6.用户个人中心修改个人资料 7.用户查看自己的选课记录&#xff0c;可以取消选课 8.查看…