「一本通 2.1 练习 8」收集雪花

news/2024/6/18 22:06:14 标签: c++, 算法, 开发语言, KISS

题目描述

不同的雪花往往有不同的形状。在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们。一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状。在收集的过程中,同学们不希望有重复的雪花。你可以从任意 a 时刻开始,在 b 时刻停止。a 到 b 时刻中间的雪花也都将被收集。他们希望收集的雪花最多。

输入格式

第一行一个正整数 n;

第 2 行 n 个非负整数表示 n 个时刻雪花的形状。

输出格式

最多能收集雪花的数量。

样例

输入

5
1 2 3 2 1

输出

3
数据范围与提示
对于 97 分的数据, 1 ≤ n ≤ 1 0 6 , 0 ≤ x i ≤ 1 0 8 1\le n \le 10^6, 0\le x_i \le 10^8 1n106,0xi108。(为原始数据)

应用户要求,加入 3 分的数据, 1 ≤ n ≤ 1 0 6 , 0 ≤ x i ≤ 1 0 9 1\le n\le 10^6,0\le x_i\le 10^9 1n106,0xi109

分析

老水题了,使用unordered_set即可,在此给出相关用法:
笔者在此说明一下unordered_set是C++标准库中的一种关联容器,它提供了一种无序、唯一值的集合。使用HASH技术实现:

  1. emplace:在集合中插入一个新元素。该函数的参数是要插入的元素。
  2. count:返回集合中特定元素的个数。由于unordered_set中的元素是唯一的,所以该函数的返回值只能是0或1。
  3. erase:从集合中删除一个元素。该函数的参数可以是元素本身或者迭代器指向的位置(笔者先不讨论迭代器),它会将匹配到的元素从集合中删除。
下面的了解即可,代码中未使用
  1. empty:检查集合是否为空。当集合中没有任何元素时,该函数返回true;否则返回false。与很多容器相似
  2. size:返回集合中元素的数量,并以整数形式返回。

代码

#include<bits/stdc++.h>
using namespace std;
int a,n,ans=0;
queue<int> q;
unordered_set<int> aa;
int main(){
	cin>>n;
	for (int i=1;i<=n;i++) {
		scanf("%d",&a);
		if (aa.count(a)==1) {
			while (!q.empty()){
				int tmp=q.front();q.pop();aa.erase(tmp);
				if (tmp==a) break;
			}
		}
		aa.emplace(a);
		q.push(a);
		ans=max(ans,(int)q.size());
	}
	cout<<ans;
	return 0;
}

分析

#include<bits/stdc++.h>
using namespace std;
int a,n,ans=0;
queue<int> q;
unordered_set<int> aa;

a 是当前时刻下落的雪花形状,n 是时刻的总个数,ans 是最终结果的变量。q 是一个队列,用于存储当前正在收集的雪花形状,aa 是一个哈希集合,用于存储已经出现过的雪花形状。(判重)

int main(){
	cin>>n;
	for (int i=1;i<=n;i++) {
		scanf("%d",&a);
		if (aa.count(a)==1) {
			while (!q.empty()){
				int tmp=q.front();q.pop();aa.erase(tmp);
				if (tmp==a) break;
			}
		}
		aa.emplace(a);
		q.push(a);
		ans=max(ans,(int)q.size());
	}
	cout<<ans;
	return 0;
}
  1. 读入时刻的总个数 n
  2. 通过一个循环遍历每个时刻下落的雪花形状。使用 scanf("%d",&a) 读入当前时刻的雪花形状。
  3. 接下来进行判断,如果这个雪花形状已经出现过(即哈希集合 aa 中已经存在该元素),则需要将队列中已经收集的、从头开始直到遇到重复形状的雪花形状都弹出队列,并从集合 aa 中删除对应的元素。然后将当前雪花形状加入集合 aa 中,并将其压入队列。最后更新最大收集数量 ans,即为队列的大小。最后输出结果 ans

http://www.niftyadmin.cn/n/473076.html

相关文章

uniapp 蓝牙模块封装

文章目录 蓝牙模块封装代码代码介绍 蓝牙模块封装代码 class BluetoothClass{constructor(deviceId,serviceId,notifyId,writeId){this.deivceList_find []this.deviceId deviceIdthis.serviceId serviceIdthis.notifyId notifyIdthis.writeId writeId}//获取所有蓝牙设备…

深入浅出设计模式 - 原型模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

程序员如何晋升项目经理?掌握这些能力很关键!

对于程序员来说&#xff0c;想要在本行业实现职业转型&#xff0c;晋升为项目经理是一个不错的选择&#xff0c;一方面程序员本身有一定的技术积累&#xff0c;不至于出现专业问题无法沟通的情况&#xff1b;另一方面&#xff0c;IT行业本身也都在往项目化方向发展&#xff0c;…

Just KNIME it [S2C13] 机器学习的可解释性

朋友们&#xff0c;Just KNIME it 还有在跟进吗? 本季已经到 13 期啦。 本期探讨的主题是机器学习的可解释性问题&#xff0c;快随指北君一起看看吧。 挑战 挑战13&#xff1a;揭示犯罪率之迷 难度&#xff1a;中等 情境描述&#xff1a;作为一名在房地产公司任职的数据科学家…

Econ3116-econ5116-week5知识点精讲-规模经济、垄断竞争与贸易

对本文有疑问可以加微信 Tutor_0914联系。也可以访问我的个人辅导网站 &#xff1a; tutoryou 总结 这节课的topic本人总结如下&#xff1a; 了解规模经济、垄断竞争和贸易之间的关系&#xff0c;以及如何用垄断竞争模型分析国际贸易的影响 了解生产者异质性、垄断竞争和贸易…

docker --hbase部署

拉取镜像 docker pull harisekhon/hbase启动容器 docker run -d -h 127.0.0.1 -p 2181:2181 -p 8080:8080 -p 8085:8085 -p 9090:9090 -p 9000:9000 -p 9095:9095 -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 -p 16020:16020 --name hbase harisekho…

如何利用API优化你的应用程序?

API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是不同应用程序之间进行通信和数据传输的标准接口。通过使用API&#xff0c;开发者可以更加方便、高效地编写自己的应用程序&#xff0c;并与其他程序互动。在现代Web应用程序中&…

【算法题解】42. 二叉树的前序遍历

这是一道 简单 题 https://leetcode.cn/problems/binary-tree-preorder-traversal/ 题目 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&…