AtCoder Beginner Contest 226 B Counting Arrays 容器vector 集合set 初始化和基本操作 方法函数

博主分享了自己首次参加AtCoder比赛的经历,通过实例介绍了如何使用vector和set解决数组去重问题。在学习vector的过程中,博主详细列举了vector的初始化和常用内置函数,并解释了其作为动态数组的特点。对于set,博主强调了其关联容器的特性,元素自动排序且唯一。最后,博主运用学到的知识解决了给定序列不重复个数的问题,代码成功AC。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ACM实验室要比赛筛人了,说是要在AtCoder上参加AtCoder Beginner Contest 230 这场比赛。

还从来没有在AtCoder上做过题,看到刚结束的AtCoder Beginner Contest 226,就打开做了做。

第一题,三位小数四舍五入,算是签到题了,4分钟,A了。(心里想,这Beginner Contest难度挺。。。。。

第二题,筛掉重复的数组,我。。。。想了想,暴力,不行,害,不会了。

快上课了,简简单单看了个题解,真的妙。

(提到组,就可以考虑vector)
(提到重复,就可以考虑set)

可,vector和set不会呀,怎么办怎么办。

还能怎么办,学呗。

先学一下vector:

是啥:是个容器,可容纳许多类型,还可以看成动态数组。
咋用:#include<vector> 头文件,不用说了。

初始化:
1、定义一个动态数组:

vector<int>a;

输一个数据,开一个空间。
2、定义一个10个元素的向量,没初值,随机数。虽然devc++上初值是0:

vector<int>a(10);

3、定义并赋值,十个值都为1:

vector<int>a(10,1);

4、定义vector a 并从vector b中赋值,a和b一样:

vector<int>a(b);

5、定义vector a 并用vector b中某些值赋值,从0到5(不包括5)

vector<int>a(b.begin(),b.begin()+5);

6、从数组中初始化赋值:

int a[5]={1,2,3,4,5};
vector<int>b(a,a+5);

初始化之后,就看最重要的内置函数了,这里写点常用的:

返回a的第一个元素:a.front();
返回a的最后一个元素:a.back();
返回a的第i个元素(元素存在):a[i];
清空a中元素:a.clear();
判断是否为空:a.empty();
删除a的最后一个元素:a.pop_back();
删除a的13位置的元素:a.erase(a.begin()+1,a.begin()+3);
在a最后插入一个元素6:a.push_back(6);
在a的第一个元素的位置插入元素6:a.insert(a.begin()+1,6);
在a的第13的元素位置插入三个6:a.insert(a.begin()+1,3,6);
返回a的元素个数:a.size();
a中元素与b中元素整体交换:a.swap(b);

vector算是写完了,吃饭去。
第二天接着写set:
先插入一个预备小知识:关联式容器和顺序容器。

关联容器中的元素按关键字保存和访问,顺序容器中元素按它们在容器中的位置顺序保存和访问。

这特点导致,关联容器不支持顺序容器的位置相关的操作,但支持高效的关键字查找和访问。

set中元素自动排序,元素值唯一。

头文件不用说了吧:#include<set>
初始化:set<int> a;
常用方法:

a.begin();返回set中第一个元素
a.end();返回set中最后一个元素
a.clear();删除set中所有元素
a.empty();判断set中是否为空
a.size();返回当前set中的元素个数

终于学完基本的vector和set,强大的stl以后一定常用。
接下来看这个题吧。
题目大概这个意思:给你N个S长度的序列,不重复的序列个数有多少个。

上vector和set!

把每个序列都存到vector里,这样:

int n;
cin >> n;
vector<int> tmp;
for(int i=1;i<=n;i++)
{
	int s;
	cin >> s;
	tmp.push_back(s);
}

然后是创建set,把每个vector插入set中去,像这样:

set<vector<int> > mp;
mp.insert(tmp);

最后输出set的长度:

cout << mp.size() << endl;

所以,这道题AC的代码:

#include<iostream>
#include<vector>
#include<set>
using namespace std;
int main()
{
	int t;
	cin >> t;
	set<vector<int> > mp;
	while(t--)
	{
		int n;
		cin >> n;
		vector<int>tmp;
		for(int i=1;i<=n;i++)
		{
			int s;
			cin >> s;
			tmp.push_back(s);
		}
		mp.insert(tmp);
	}
	cout << mp.size() << endl;
	return 0;
}

管事!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三元湖有大锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值