CCF CSP 2019-09-2 小明种苹果(续) 解题思路及满分代码(C++11)

2023-05-16

文章目录

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

问题描述

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

问题分析

题目不难理解,求T(苹果的总数)和E(有苹果掉落的树的个数)也没什么难度,遍历数组进行判断就可以实现,这里略过(后面完整代码注释里会有)。

主要要解决的问题在于如何统计E(连续三棵树都有苹果掉落的个数)。首先题中是将所有果树种成一个圆的,而我们在存储题中所给的信息时一般是用数组的形式,所以在统计E的个数时,我们需要考虑数组头尾相接的情况。

这里我用一个int数组flag[N]来标记每一棵树是否有苹果掉落的情况,有掉落则为1;没有则为0。

然后我们只需要找出值连续为1的区间,统计其中连续三个一组的组数,最后在考虑一下首尾相接的情况就可以了。

在这里插入图片描述

以上图情况为例,0~4都为1,以连续三个为一组的话分组就有3组,故而对于每一段连续count个1的区间,我们不难得出三个一组的数量为 ( c o u n t − 3 ) + 1 (count-3)+1 (count3)+1

对于首尾相接的情况,只有两种可能是连续三个为1,即flag[N-2]、flag[N-1]、flag[0] 和 flag[N-1]、flag[0]、flag[1],直接用两个if语句判断一下。

int D=0, E=0; //D为有果子掉落的树的个数,E为相邻三个一组都有掉落的组数 
	int count = 0;
	for(int i=0; i<N; i++) {
		if(flag[i]==1) {
			D++;
			count++;
		}else { //遇到flag等于0时,根据当前连续flag==1的个数,计算出相邻三个一组的个数 
			if(count>=3)  { 
			    E += 1+(count-3);	
			}
			count = 0;
		}
	} 
	if(count>=3)  E += 1+(count-3);	 //遍历结束时若count不为0,计算相邻三个一组的个数 
	//考虑头尾相接的情况: 
	if((flag[N-2]==1) && (flag[N-1]==1) && (flag[0]==1)) E++;
	if((flag[N-1]==1) && (flag[0]==1) && (flag[1]==1)) E++;

满分代码

由于对每棵树的操作次数不一定相同,所以我用STL中的vector容器来存储所有的操作记录,定义一个vector类型的数组,每一棵树对应数组中一个vector。(由于操作记录绝对值最大可达 1 0 6 10^6 106,所以要开long long防止错误)

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<long long> oper[1001];

int main() {
	int N, m;
	cin >> N;
	for(int i=0; i<N; i++) {
		cin >> m;
		long long temp;
		for(int j=0; j<m; j++) {
			cin >> temp;
			oper[i].push_back(temp);
		}
	}
	
	long long result[N]; //最终每棵树上的果子个数
	long long T = 0; //最后所有果子的总数 
	int flag[N] = {0}; //标记每棵树是否有果子掉落 
	for(int i=0; i<N; i++) {
		vector<long long>::iterator it = oper[i].begin();
		result[i] = *it;
		it++;
		while(it!=oper[i].end()) {
			long long temp = *it;
			//操作数为负数,表示进行了疏果 
			if(temp<=0) {
			    result[i] += temp;	
			}
			else {  //没有进行疏果,则要判断是否有果子掉落 
				if(temp<result[i]) {
					flag[i]=1;
				}
				result[i] = temp;
			}
			it++;
		}
		T += result[i];
	} 
	
	
	int D=0, E=0; //D为有果子掉落的树的个数,E为相邻三个一组都有掉落的组数 
	int count = 0;
	for(int i=0; i<N; i++) {
		if(flag[i]==1) {
			D++;
			count++;
		}else { //遇到flag等于0时,根据当前连续flag==1的个数,计算出相邻三个一组的个数 
			if(count>=3)  { 
			    E += 1+(count-3);	
			}
			count = 0;
		}
	} 
	if(count>=3)  E += 1+(count-3);	 //遍历结束时若count不为0,计算相邻三个一组的个数 
	//考虑头尾相接的情况: 
	if((flag[N-2]==1) && (flag[N-1]==1) && (flag[0]==1)) E++;
	if((flag[N-1]==1) && (flag[0]==1) && (flag[1]==1)) E++;
	
	cout << T << " " << D << " " <<E;
	return 0;
}

在这里插入图片描述

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

CCF CSP 2019-09-2 小明种苹果(续) 解题思路及满分代码(C++11) 的相关文章

  • 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
  • C++结构体数组 | 结构体数组的使用

    C 43 43 结构体数组 C 43 43 结构体数组与以前介绍过的数值型数组的不同之处在于 xff1a 每个数组元素都是一个结构体类 型的数据 xff0c 它们都分别包括各个成员项 C 43 43 结构体数组定义 C 43 43 结构体数

随机推荐