题解 P1786 【帮贡排序】

· · 题解

这题考察的是结构体排序。

由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构体(struct)——百度百科。

定义一个结构体的方式如下:

struct 结构体名称{
成员1数据类型 成员1名称
成员2数据类型 成员2名称
成员3数据类型 成员3名称
....
};
结构体名称 变量名或数组名;

结构体也可以调用C++库里的sort,不过要自己写判断函数或重定义运算符(这里推荐大家写前者,因为方便一些)

判断函数写法如下:

bool 判断函数名称(结构体名称 变量1,结构体名称 变量2){
   return 你的判断方式 ;
}

推荐练手题: P5728 P5741

了解了以上知识,做这题就不难了。

我们先建立一个结构体,记录每人的名字,原来职位,帮贡,等级,在原队列的顺序和新职位。

接着读入每人的信息,先按照帮贡排序(帮贡相等的按原序号排序),注意帮主,副帮主不能排序,所以要从数组第四个数据开始排序。

接着按照顺序给每人授予新职位(我手写了一个函数)。

然后将每人的职位和等级排序,职位第一关键字,等级第二关键字。

这是,我们发现职位是字符串,如何排序呢?

这是,我们可以手写一个转换函数(和我上面一样),帮主是1,副帮主是2,以此类推。

转化完了后,我们只需按照上面得到的值按顺序排序即可(要按照题目给的方式排序哦!),最后输出。

代码:

#include<bits/stdc++.h> 
using namespace std;
struct people{
    string name,zw,nzw;
    long long bg,dj,xh;
}a[100005];//每个人的信息
int zdj1(string a){//将职位转换的函数
    if (a=="BangZhu") return 1;
    if (a=="FuBangZhu") return 2;
    if (a=="HuFa") return 3;
    if (a=="ZhangLao") return 4;
    if (a=="TangZhu") return 5;
    if (a=="JingYing") return 6;
    if (a=="BangZhong") return 7;
}
string zdj2(int a){//将顺序转换为职位的函数    
    if (a==1) return "BangZhu";
    if (a<=3) return "FuBangZhu";
    if (a<=5) return "HuFa";
    if (a<=9) return "ZhangLao";
    if (a<=16) return "TangZhu";
    if (a<=41) return "JingYing";
    return "BangZhong";
}
bool cmp1(people a,people b){
    if (a.bg!=b.bg) return a.bg>b.bg;//不等时按帮贡排序
    else return a.xh<b.xh;//相等时按序号排序
}//排序函数1
bool cmp2(people a,people b){
    int a1=zdj1(a.nzw),b1=zdj1(b.nzw);
    if (a1!=b1) return a1<b1;//先是职位
    else {
        if (a.dj!=b.dj) return a.dj>b.dj;//再是等级
        else return a.xh<b.xh;//最后序号
    }
}//排序函数2
int main(){ 
  int n;
  cin >> n;
  for (int i=1;i<=n;i++){
    cin >> a[i].name >> a[i].zw >> a[i].bg >> a[i].dj;
      a[i].xh=i; 
  }//读入并存储序号
  sort(a+4,a+1+n,cmp1);//注意要从4开始排序
  for (int i=1;i<=n;i++){
    a[i].nzw=zdj2(i);//存入新职位
  } 
  sort(a+1,a+1+n,cmp2);//第二次排序
  for (int i=1;i<=n;i++){
    cout << a[i].name << ' ' << a[i].nzw << ' ' << a[i].dj << endl;//输出,记得换行
  }
}