清点代码库[天梯赛]

题目描述

在这里插入图片描述
在这里插入图片描述

输入样例
7 3
35 28 74
-1 -1 22
28 74 35
-1 -1 22
11 66 0
35 28 74
35 28 74
输出样例
4
3 35 28 74
2 -1 -1 22
1 11 66 0
1 28 74 35

思路

vector容器自带比较,可以直接利用=判断是否相同

具体做法如下:我们利用set可以自动去重排序的特点,将每一种结果及其对应的种数先用map存储,然后遍历map中的结果,将其存进set容器中

需要注意两个点

1.map和set的类型,map为结果映射种数,set为种数映射到结果的数对类型。此外,数对先按照first排序
2.题目要求我们从大到小输出,但set不方便倒序遍历,因此,我们可以将pair数对的一维,即first,用其相反数存储,这样越大的数字,反而越小,就会排在越靠前的位置

AC代码

#include <iostream>
#include <map>
#include <set> 
using namespace std;
const int N = 1010;
vector<int> v;
set<pair<int, vector<int> > > s; //种数,结果 
map<vector<int>, int> mp;//结果,种数 
int main()
{
	int n, m; 
	cin >> n >> m;
	for(int i = 0; i < n; i ++)
	{
		v.clear();
		for(int j = 0; j < m; j ++)
		{
			int num;
			cin >> num;
			v.push_back(num);
		}
		if(!mp.count(v)) mp[v] = 1; //该结果第一次出现
		else mp[v] ++; 
	}
	for(map<vector<int>, int>:: iterator it = mp.begin(); it != mp.end(); it ++)
	{
		s.insert({-(it->second), it->first});
	}
	cout << mp.size() << endl;
	for(auto i : s)
	{
		cout << -i.first << " ";
		for(int j = 0; j < m; j ++)
		{
			if(j != m - 1) cout << i.second[j] << " ";
			else  cout << i.second[j] << endl;
		}
	}
	return 0;
} 

欢迎大家批评指正!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值