题解 P1786 【帮贡排序】

· · 题解

很明显,这是一道排序题,但是卡了很多人的一点是:

怎么排?

由题意,我们经过一定时间的提炼可以总结出一下排序位置以及排序方式:

1.所有信息输入后排序,排序方式如下:

(1)先按帮贡排序;

(2)如帮贡一样,则按输入顺序排列。

2.再重新编好职位后排输出顺序,也就是职位内的排名,排序方式如下:

(1)先按现在的职位排序;

(2)如职位相同,再按等级排序;

(3)如果恰好等级还破天荒地一样,则按输入顺序排列。

如果看到这你的疑惑已经解开了,那就点完赞继续写你的代码吧!还不会写的小伙伴们跟我来!

具体实施

1.输入与初始化

int n;//储存帮内人数
struct node{
    string na,zw,xzw;//尊姓大名,过去高位,如今高位
    long long bg;//帮贡(不开long long见祖宗)
    int le,h;//等级,输入序号
}ab[115];//结构体储存信息,方便排序
cin>>n;
for (int i=1;i<=n;i++){
    cin>>ab[i].na>>ab[i].zw>>ab[i].bg>>ab[i].le;//分别输入
    ab[i].h=i;//处理序号
}

2.排序1(注意!帮主副帮主不会改变职位!

//主函数内
sort(ab+4,ab+1+n,cmp1);
//排序函数1
int cmp1(node x,node y){
    if (x.bg==y.bg) return x.h<y.h;//帮贡相等,按序号排序;
    else return x.bg>y.bg;//否则按帮贡排序
}

3.授予职位

for (int i=1;i<=n;i++){//按先顺序授予每个人职位
    if (i==1) ab[i].xzw="BangZhu";
    else if (i==2||i==3) ab[i].xzw="FuBangZhu";
    else if (i==4||i==5) ab[i].xzw="HuFa";
    else if (i>=6&&i<=9) ab[i].xzw="ZhangLao";
    else if (i>=10&&i<=16) ab[i].xzw="TangZhu";
    else if (i>=17&&i<=41) ab[i].xzw="JingYing";
    else ab[i].xzw="BangZhong";
}

4.排序2

//主函数内
sort(ab+1,ab+1+n,cmp2);
//排序函数2
int cmp2(node x,node y){
    if (change(x.xzw)==change(y.xzw)){
        if (x.le==y.le) return x.h<y.h;//现职位相等且等级相等,按输入顺序排列
        return x.le>y.le;//等级不等按等级排序
    }
    return change(x.xzw)<change(y.xzw);//现职位不等按现职位大小排序,使用自定义change函数
}
//职位转化数字函数
int change(string a){
    if (a=="BangZhu") return 0;
    if (a=="FuBangZhu") return 1;
    if (a=="HuFa") return 2;
    if (a=="ZhangLao") return 3;
    if (a=="TangZhu") return 4;
    if (a=="JingYing") return 5;
    if (a=="BangZhong") return 6;
}

5.完美输出

for (int i=1;i<=n;i++){
    cout<<ab[i].na<<" "<<ab[i].xzw<<" "<<ab[i].le<<endl;
}

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
    string na,zw,xzw;
    long long bg;
    int le,h;
}ab[115];
int change(string a){
    if (a=="BangZhu") return 0;
    if (a=="FuBangZhu") return 1;
    if (a=="HuFa") return 2;
    if (a=="ZhangLao") return 3;
    if (a=="TangZhu") return 4;
    if (a=="JingYing") return 5;
    if (a=="BangZhong") return 6;
}
int cmp1(node x,node y){
    if (x.bg==y.bg) return x.h<y.h;
    else return x.bg>y.bg;
}
int cmp2(node x,node y){
    if (change(x.xzw)==change(y.xzw)){
        if (x.le==y.le) return x.h<y.h;
        return x.le>y.le;
    }
    return change(x.xzw)<change(y.xzw);
}

int main(){
    cin>>n;
    for (int i=1;i<=n;i++){
        cin>>ab[i].na>>ab[i].zw>>ab[i].bg>>ab[i].le;
        ab[i].h=i;
    }
    sort(ab+4,ab+1+n,cmp1);
    for (int i=1;i<=n;i++){
        if (i==1) ab[i].xzw="BangZhu";
        else if (i==2||i==3) ab[i].xzw="FuBangZhu";
        else if (i==4||i==5) ab[i].xzw="HuFa";
        else if (i>=6&&i<=9) ab[i].xzw="ZhangLao";
        else if (i>=10&&i<=16) ab[i].xzw="TangZhu";
        else if (i>=17&&i<=41) ab[i].xzw="JingYing";
        else ab[i].xzw="BangZhong";
    }
    sort(ab+1,ab+1+n,cmp2);
    for (int i=1;i<=n;i++){
        cout<<ab[i].na<<" "<<ab[i].xzw<<" "<<ab[i].le<<endl;
    }
    return 0;
}

我绝对不是dalao,但你看得这么认真,点个赞加个油吧!