2021年天梯赛LV2的第三题
有内容,有计数,那么使用map,
关键字即代码,关键字的值即该代码出现的次数
map<vector<int>,int> m;
set容器有自动排序的功能
map提供一对一的数据处理能力,第一个称为关键字,在map中只能出现一次,第二个称为该关键字的值
pair是将两个数据组合成一个数据
总结一下:
先用map存储,再使用set排序
#include<bits/stdc++.h>
using namespace std;
int n,m;
set<vector<int> > s;
map<vector<int> , int> mp;
struct cmp {
bool operator() (const pair<vector<int> ,int> &a, const pair<vector<int>, int> &b) const{
if(a.second!=b.second){
return a.second>b.second;
}else{
return a.first<b.first;
}
}
};
set<pair<vector<int>,int> ,cmp> List;
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++){
vector<int> temp;
for(int j=0;j<m;j++){
int x;
cin>>x;
temp.push_back(x);
}
s.insert(temp);
mp[temp]++;
}
cout<<s.size()<<endl;
for(auto it = s.begin();it!=s.end();it++){
List.insert({*it,mp[*it]});
}
for(auto it = List.begin();it!=List.end();it++){
cout<<(*it).second;
for(int i=0;i<(*it).first.size();i++){
cout<<" "<<(*it).first[i];
}
cout<<endl;
}
return 0;
}
或者使用algorithm的sort函数
#include<bits/stdc++.h>
using namespace std;
int n,m,x;
map<vector<int>,int> mp;
vector<pair<int,vector<int>>> ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
vector<int> v;
for(int j=0;j<m;j++){
scanf("%d",&x);
v.push_back(x);
}
mp[v]++;
}
printf("%ld\n",mp.size());
map<vector<int>,int>::iterator it;
for (it = mp.begin(); it != mp.end(); ++it)
ans.push_back({-it->second,it->first});
sort(ans.begin(),ans.end());
vector<pair<int,vector<int>>>::iterator i;
vector<int>::iterator j;
for(i = ans.begin(); i != ans.end(); ++i){
printf("%d",-i->first);
for(j=i->second.begin();j!=i->second.end();j++){
printf(" %d",*j);
}
printf("\n");
}
}