CCF CSP 2019-12-2 “回收站选址” 解题思路及满分代码(C++11)

2023-05-16

文章目录

    • 题目描述
    • 问题分析
    • 满分代码

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题分析

题目不难理解,一共两个重要条件:

  1. 一个点是否能成为回收站:它自己以及上下左右四个点都有垃圾
  2. 一个回收站的得分:它的四个角上的垃圾数

最后要我们求得分为0,1,2,3,4 的回收站分别有多少个。

所以我们一共要做两件事:(1)找出所有能成为回收站的的点;(2)对所有回收站点统计它的得分

以上两个判断都不难,只是几个if语句的问题,下面最重要的就是应该如何去存储所有的点坐标。

可能大家和我一样首先会想到用二维数组来表示点坐标,有垃圾的点值为1,这样可以很快访问各个点,判断周围点是否有垃圾也非常方便。但是我们注意到题中最后有一个条件:==部分测试点的坐标可以是负数。==所以用二维数组来表示坐标是肯定无法得到满分的。

所以我定义一个结构体,所有坐标存储在一个结构体数组内,注意:由于坐标值最大可以到 1 0 9 10^9 109,所以int型范围不够。

typedef struct point{
	long long x, y;
}point;
point loc[1001];

这样一来,数组里存储的就全部是有垃圾的点坐标,每次判断一个点上有无垃圾就需要对该数组进行遍历查找。不过n最大只会到 1 0 3 10^3 103,在main函数中我们最多只会用到双重循环,所以不用担心会有超时的问题。这里我将遍历数组查找封装成一个函数,这样在写主函数时方便简洁。

//判断坐标点上是否有垃圾,即是否存在于loc数组中(n为循环边界,即有垃圾坐标的总个数) 
bool isExist (long long  x, long long y, int n) {
	for(int i=0; i<n; i++) {
		if(loc[i].x==x && loc[i].y==y) return true;
	}
	return false;
}

在主函数中,我们就只需要先选出所有可成为回收站的点,再对他们分别统计得分就可以了。

最后贴上满分代码

满分代码

#include<cstdio>
#include<iostream>
#include<set>
using namespace std;

typedef struct point{
	long long x, y;
}point;
point loc[1001];

//判断坐标点上是否有垃圾,即是否存在于loc数组中(n为循环边界,即有垃圾坐标的总个数) 
bool isExist (long long  x, long long y, int n) {
	for(int i=0; i<n; i++) {
		if(loc[i].x==x && loc[i].y==y) return true;
	}
	return false;
}

int main() {
	int n;
	cin >> n;
	for(int i=0; i<n; i++) {
		cin >> loc[i].x >> loc[i].y;
	}
	set<int> rub; //用于存储回收站在loc数组中的下标 
	long long dx, dy; //坐标临时变量 
	for(int i=0; i<n; i++) {
		dx = loc[i].x;
		dy = loc[i].y;
		//判断上下左右是否都有垃圾点,是则成为回收站 
		if(isExist(dx-1,dy,n) && isExist(dx,dy-1,n) && isExist(dx+1,dy,n) && isExist(dx,dy+1,n)) {
			rub.insert(i);
		}
	}
	
	int result[5] = {0}; //存储最终结果的数组 
	//对每个回收站统计其得分 
	for(set<int>::iterator it=rub.begin(); it!=rub.end(); it++) {
		int index = *it;
		int score = 0; //四个角存在的垃圾点个数,即得分 
		dx = loc[index].x;
		dy = loc[index].y;
		if(isExist(dx-1,dy-1,n)) score++;
		if(isExist(dx-1,dy+1,n)) score++;
		if(isExist(dx+1,dy-1,n)) score++;
		if(isExist(dx+1,dy+1,n)) score++;
		
		result[score]++;
	}
	
	for(int i=0; i<5; i++) {
		cout << result[i] <<endl;
	}
	
	return 0;
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CCF CSP 2019-12-2 “回收站选址” 解题思路及满分代码(C++11) 的相关文章

  • ssh链接远程服务器 及 远程图形化界面的本地显示

    文章目录 一 ssh链接远程服务器1 1 MobaXterm1 2 VSCode问题与解决 对比 二 远程图形化界面的本地显示2 1 MobaXterm2 2 VSCode2 3 总结 附录参考 一 ssh链接远程服务器 这个方法有很多 x
  • window子系统wsl2安装kali及桌面

    一 先升级wsl2 xff08 1 xff09 wsl1没有Linux的内核 xff0c 所以很多Linux版本的工具都无法在wsl1中运行 xff0c 比如 xff1a docker xff0c Linux版本的浏览器等等 所以需要升级为
  • 数组下标赋值和指针赋值效率探索

    使用数组下标赋值和指针赋值效率探索 span class token keyword int span span class token function main span span class token punctuation spa
  • Archlinux/Manjaro使用笔记-报错:一个或多个 PGP 签名无法校验!的解决方法

    Archlinux Manjaro使用笔记 报错 xff1a 一个或多个 PGP 签名无法校验 xff01 的解决方法 参考文章 xff1a xff08 1 xff09 Archlinux Manjaro使用笔记 报错 xff1a 一个或多
  • Hadoop生态圈

    Hadoop生态圈 1 什么是Hadoop xff1f Hadoop是由Apache基金会所开发的分布式系统架构 主要解决 xff0c 海量数据的存储和海量数据的分析计算问题广义上来说 xff0c Hadoop通常是指一个更加广泛的概念 H
  • 【解决方案】error: Microsoft Visual C++ 14.0 or greater is required.【保姆级教程】

    在给python虚拟环境安装某些第三方库时 xff0c 会碰到以下报错 error Microsoft Visual C 43 43 span class token number 14 0 span or greater is requi
  • Hadoop3.2.2完全分布式集群环境搭建(一)

    大数据学习之Hadoop3 2 2集群环境搭建 xff08 一 xff09 Hadoop3 2 2完全分布式集群环境搭建 xff08 二 xff09 Zookeeper入门之分布式集群的搭建 xff08 三 xff09 HBase分布式集群
  • picgo+github 图床的使用

    picgo 43 github图床的使用 PicGo这款工具 xff0c 可以轻易的将图片转换为链接 1 准备工作 下载picgo xff1a 在github新建一个仓库 xff0c 用来存放图片 2 然后进入github设置 xff1a
  • Zookeeper入门之分布式集群的搭建(二)

    Zookeeper入门之分布式集群的搭建 xff08 一 xff09 Hadoop3 2 2完全分布式集群环境搭建 xff08 二 xff09 Zookeeper入门之分布式集群的搭建 xff08 三 xff09 HBase分布式集群的搭建
  • HBase分布式集群的搭建(三)

    HBase分布式集群的搭建 xff08 一 xff09 Hadoop3 2 2完全分布式集群环境搭建 xff08 二 xff09 Zookeeper入门之分布式集群的搭建 xff08 三 xff09 HBase分布式集群的搭建 安装 准备工
  • springboot集成swagger3.0

    Swagger3 0 最新版使用 Swagger 最新版的配置步骤和旧版本是一样 xff0c 只是每个具体的配置项又略有不同 xff0c 具体步骤如下 1 添加依赖 span class token comment lt https mvn
  • Windows/IDEA 常用快捷键

    windows 搜索的快捷键 ctr 43 F 切换窗口 win 43 1 2 3 根据任务栏切换 win 43 tab 显示图标 alt 43 esc 切换到上一个 最小化当前窗口 ctr 43 ESC 最小化所有窗口 CTR 43 D
  • windows mysql8.0.26的安装

    mysql8 0 26的安装 1 下载 https dev mysql com downloads mysql 2 解压并在mysql中的bin目录下创建my ini配置文件 mysqld 设置3306端口 port 61 3306 设置m
  • Linux(Debian,Centos,Ubuntu等) gcc的安装

    Linux gcc的安装 xff08 一 xff09 准备工作 1 什么是gcc xff1f GNU编译器集合 xff08 GCC xff09 是一个开源的编译器和库集合 xff0c 支持C xff0c C 43 43 xff0c Obje
  • nodeJs开发app.js解析

    在 node js 中模块分为核心模块和文件模块两种 xff0c 核心模块是通过 require 39 xxxx 39 导入的 xff0c 文件模块是以 require 39 xxxx 39 或 require 39 xxxx 39 req
  • Linux 安装最新版Redis(超简单详细)

    Redis最新版的安装 可以从官网下载 xff0c 然后传输到你的GUN linux中 xff0c 也可像下面那样用wget命令下载 xff0c 下载完后安装步骤基本一样 xff08 一 xff09 安装 1 下载 span class t
  • git:OpenSSL SSL_read: Connection was reset, errno 10054

    方式一 xff1a 可能为网络不稳定 xff0c 连接超时导致的 xff0c 可再次尝试提交 span class token function git span push 方式二 xff1a 打开Git命令页面 xff0c 执行git命令
  • springcloud nacos config快速入门

    nacos config 1 为什么需要配置中心 xff1f 传统配置的方式已经暴露出了很多问题 xff0c 其他的诸如 xff1a 历史版本管理 xff0c 权限控制 xff0c 安全性等等问题 xff0c 是传统的配置文件无法解决的 x
  • 左移运算符和右移运算符的使用

    先简单介绍一下 xff0c 左移运算符和右移运算符的功能 xff1a 计算机中的数字是以二进制补码的形式存放的 xff0c 而左移和右移运算符就是将内存中的二进制补码数字向左或者右移动 左移的结果 xff1a 1 左移会让最高位溢出 xff
  • 51单片机对直流电机的控制

    占空比 61 周期内高电平持续的时间 整个周期 直流电机驱动芯片选择L293D 电机正转 xff1a span class token macro property span class token directive hash span

随机推荐