排序问题
坑点如下
1,比较函数的传参尽量用引用传参。
2,单作为映射可以用unordered_map,内部元素是无序的。
代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
#include<unordered_map>
#include<vector>
#include<algorithm>
using namespace std;
struct Node{
string id;
int score,site;
}node;
struct Node1{
int si,num;
Node1(int a,int b){
si=a;
num=b;
}
};
unordered_map<string,vector<Node>>m1,m2,m3;
bool cmp1(const Node &a,const Node &b){
return a.site<b.site;
}
bool cmp3(const Node &a,const Node &b){
return a.score!=b.score?a.score>b.score:a.id<b.id;
}
bool cmp4(const Node1 &a,const Node1 &b){
return a.num!=b.num?a.num>b.num:a.si<b.si;
}
int main(){
int n,m,t,total;
string l;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>node.id;
scanf("%d",&node.score);
node.site=stoi(node.id.substr(1,3));
m1[node.id.substr(0,1)].push_back(node);
m2[node.id.substr(1,3)].push_back(node);
m3[node.id.substr(4,6)].push_back(node);
}
for(int i=1;i<=m;i++){
cin>>t>>l;
printf("Case %d: %d %s\n",i,t,l.c_str());
if(t==1){
if(m1[l].size()==0)printf("NA\n");
else{
sort(m1[l].begin(),m1[l].end(),cmp3);
for(int b=0;b<m1[l].size();b++)
printf("%s %d\n",m1[l][b].id.c_str(),m1[l][b].score);
}
}
else if(t==2){
if(m2[l].size()==0)printf("NA\n");
else{total=0;
for(int b=0;b<m2[l].size();b++)
total+=m2[l][b].score;
printf("%d %d\n",int(m2[l].size()),total);
}}
else if(t==3){
if(m3[l].size()==0)printf("NA\n");
else {vector<Node1>k;
int num=1,now;
sort(m3[l].begin(),m3[l].end(),cmp1);
now=m3[l][0].site;
for(int b=1;b<m3[l].size();b++){
if(m3[l][b].site==now)num++;
else{ k.push_back(Node1(now,num));
num=1;
now=m3[l][b].site;}
}
k.push_back(Node1(now,num));
sort(k.begin(),k.end(),cmp4);
for(int b=0;b<k.size();b++)
printf("%d %d\n",k[b].si,k[b].num);
}
}
}
return 0;
}