【L2-039 清点代码库 】天梯赛L2系列详解

天梯赛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当键值套进其他容器中,包括自己也能套进去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值