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