只有第一个测试点对了。
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
string name,bzw,nzw;
int exp,lv,id;
}a[115];
int f(string s){
if(s=="BangZhu") return 0;
else if(s=="FuBangZhu") return 1;
else if(s=="HuFa") return 2;
else if(s=="ZhangLao") return 3;
else if(s=="TangZhu") return 4;
else if(s=="JingYing") return 5;
else if(s=="BangZhong") return 6;
}
bool cmp1(node x,node y){
if(x.exp==y.exp){
return x.id<y.id;
}
return x.exp>y.exp;
}
bool cmp2(node x,node y){
if(f(x.nzw)==f(y.nzw)){
if(x.lv==y.lv) return x.id<y.id;
return x.lv>y.lv;
}
return f(x.nzw)<f(y.nzw);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].name>>a[i].bzw>>a[i].exp>>a[i].lv;
a[i].id=i;
}
sort(a+4,a+n+1,cmp1);
for(int i=1;i<=n;i++){
if(i==1) a[i].nzw="BangZhu";
else if(i>=2 && i<=3) a[i].nzw="FuBangZhu";
else if(i>=4 && i<=5) a[i].nzw="HuFa";
else if(i>=6 && i<=9) a[i].nzw="ZhangLao";
else if(i>=10 && i<=16) a[i].nzw="ZhangLao";
else if(i>=17 && i<=41) a[i].nzw="JingYing";
else a[i].nzw="BangZhong";
}
sort(a+1,a+n+1,cmp2);
for(int i=1;i<=n;i++){
cout<<a[i].name<<" "<<a[i].nzw<<" "<<a[i].lv<<endl;
}
return 0;
}