算法-多条件排序
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;}}
}