算法-多条件排序

发布于:2025-06-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

 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;
        }
    }
}