1、数对排序的使用
pair<ll,ll> a[31];
//cmp为比较规则
ll cmp(pair<ll,ll>a,pair<ll,ll>b){
if(a.first!=b.first)return a.first>b.first;
else return a.second<b.second;
}
//按照比较规则进行排序
sort(a+1,a+31,cmp);
2、具体例题
输入样例:
3 1 1 2 2 9 3 6 4 7 5 11 6 3 7 13 8 8 9 16 10 4 11 19 12 17 13 5 14 12 15 15 16 14 17 10 18 20 19 18 20 5 11 10 12 30 13 22 14 1 1 28 20 21 16 26 17 2 2 24 3 4 4 29 5 8 6 7 15 6 7 3 8 9 9 25 10 23 19 27 18 19 20 26 19 27 18 18 17 21 16 12 15 28 14 20 13 17 12 14 11 13 10 23 9 29 8 22 7 30 6 15 5 24 4 25 3 16 2 11 1
输出样例:
1 50 2 42 11 39 24 34 16 31 6 29 9 29 25 28 29 27 3 25 4 25 8 25 13 22 30 21 7 20 15 19 22 19 5 15 17 15 14 12 23 12 10 10 12 10 19 8 20 8 21 8 28 6 26 4 27 4 18 3
思路:分数不同,按分数降序排列;分数相同,按编号升序排列。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
pair<ll,ll> a[31];
bool vis[31];
ll cmp(pair<ll,ll>a,pair<ll,ll>b){
if(a.first!=b.first)return a.first>b.first;
else return a.second<b.second;
}
int main(){
ll n;
cin>>n;
for(ll i=1;i<=30;i++){
a[i].first=0;//分数
a[i].second=i;//编号
}
memset(vis,false,sizeof(vis));
ll b[21]={0,25,21,18,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
while(n--){
for(ll i=1;i<=20;i++){
ll c,p;
cin>>c>>p;
a[c].first+=b[p];
vis[c]=true;
}
}
sort(a+1,a+31,cmp);
for(ll i=1;i<=30;i++){
if(vis[a[i].second]){
cout<<a[i].second<<" "<<a[i].first<<endl;
}
}
}