天梯赛L2-039 清点代码库
题目详情:
思路:
这道题目看着很简单,其实我却做不出来。
我认为的难点:
1.如果我用vector存放数据,该如何排序呢?其次,我又该怎么计数呢?
2.如果我用结构体存放数据,排序是可以解决,但是又要如何解决计数呢?
怀着这两个疑问,我先是写了第二种思路的代码,发现超时问题严重。没有办法只能采用第一种思路了,但是我又不会。只能在网上看看大佬们是如何解决这个我认为的难点的。
这个题当时写的时候就是直接找的一个博客园大佬(如果我没有记错的话)的代码,忘记收藏了。现在找不到了,不能标明出处了。。。
现在对大佬的代码进行一个详细的解析:
详细代码:
/*将每一个功能模块的输出放在vector<int>中(用temp储存),
并将其储存在map容器A内。
最后将数量与模块输出储存在可以有多个相同key值的multimap容器B内,
因为按照增序数出,所以添加一个容器参数greater<int>。
这样一来B内就是排好序的答案啦,然后直接输出答案即可*/
#include <bits/stdc++.h>
using namespace std;
int n, m, t;
vector<int> temp;//存放数据
map<vector<int>, int> A;//用来筛选不同的数据
multimap<int, vector<int>, greater<int> > B;
//因为map不能存放键值相同的数据
//而multimap可以存放键值相同的东西。作用在下面代码中解释
//greater<>容器参数,默认从大到小排序
int main()
{
scanf("%d%d", &n, &m);
temp.resize(m);//对temp进行分配空间大小
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
scanf("%d", &temp[j]);
A[temp]++;//因为只能存放不同的数据,所以一旦相同就直接++,表示出现了相同的数据
}
for (auto it : A) //迭代器;遍历A容器
B.insert({it.second, it.first});
//将A容器的key和value调换位置,插入B容器中,B中的key就变成了代码出现的次数,value就变成成了代码本身
//而且B容器中greater参数是根据键值大小排序的,正好符合题目增序排序
printf("%d\n", A.size());
//A容器的大小刚好就是不同代码的个数
for (auto it : B)//迭代器遍历B容器,按照题目要求打印即可
{
printf("%d", it.first);
for (auto it2 : it.second) //迭代器遍历要求输出代码
printf(" %d", it2);
printf("\n");
}
return 0;
}
知识总结:
学习了大佬的代码,才能让自己成长,发现自己更多的不足。
最后总结一下思路:
1、vector<int> temp来存放存放数据
2、map<vector<int>, int> A来筛选不同的数据
3、multimap<int, vector<int>, greater<int> > B来将A容器的key和value调换位置存入,最后迭代器输出答案
总结知识点:
1、map的使用和multimap的使用,要学会把vector当键值套进其他容器中,包括自己也能套进去