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的1到3位置的元素:a.erase(a.begin()+1,a.begin()+3);
在a最后插入一个元素6:a.push_back(6);
在a的第一个元素的位置插入元素6:a.insert(a.begin()+1,6);
在a的第1到3的元素位置插入三个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;
}
管事!