题解 P1786 【帮贡排序】

· · 题解

题目传送门

披着绿题的模拟水题。

只要能清楚两次排序,接下来的一系列操作易如反掌:

看题解里面的快排,cmp比较长,用三目运算符它不香吗?

变量声明:

struct node{
    string name;//名字
    int bg,level,zw,id;//帮贡、等级、职位、编号
}a[N];

string zw_name[7] = {"BangZhu", "FuBangZhu","HuFa", "ZhangLao","TangZhu", "JingYing", "BangZhong"};//职位
map<string,int> mp;//用map存储职位的高低,可以在cmp里直接比较大小(本人以数字小的职位相对高)

第一次排序(三目运算符):

帮贡从大到小排序,如果相等那么按原排列顺序,以便之后给它们安排新职位。

bool cmp(node A,node B){
    return A.bg==B.bg?A.id<B.id:A.bg>B.bg;
    //A的帮贡如果等于B的帮贡,那么按编号排,否则按帮贡从大到小排
}

第二次排序(三目运算符套三目运算符):

将新职位赋予后,把它们按职位从高到低排序,如果职位相等,那么按等级从大到小排序,如果等级相等,那么就按原排列顺序

bool cmp_(node A,node B){
    return A.zw==B.zw?A.level==B.level?A.id<B.id:A.level>B.level:A.zw<B.zw;
    //如果A的职位等于B的职位,而且A的等级等于B的等级,那么按编号排,如果A的等级与B的等级不想等,按等级从大到小排,否则按职位从高到低
}

赋予新职位的操作不多讲了,因为作者无能,写的很朴素。

完整Code(三目运算符是一大特点):

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define For(i,j,k) for(int i=(int)(j);i<=(int)(k);i++)
#define Rep(i,j,k) for(int i=(int)(j);i>=(int)(k);i--)
inline ll read(){
    ll x=0;char ch=getchar();bool f=0;
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    return f?-x:x;
}
void write(ull x){
    if(x<0) putchar('-'),x=-x;
    if(x>=10) write(x/10);putchar(x%10+'0');
}
void writeln(ull x){write(x);puts("");}
void writep(ull x){write(x);putchar(' ');}

int const N=110+3;
int n,num[7]={1,3,5,9,16,41,N};
string s,zw_name[7] = {"BangZhu", "FuBangZhu","HuFa", "ZhangLao","TangZhu", "JingYing", "BangZhong"};
map<string,int> mp;
struct node{
    string name;
    int bg,level,zw,id;
}a[N];

bool cmp(node A,node B){
    return A.bg==B.bg?A.id<B.id:A.bg>B.bg;
}
bool cmp_(node A,node B){
    return A.zw==B.zw?A.level==B.level?A.id<B.id:A.level>B.level:A.zw<B.zw;
}
int main(){
    n=read();
    for (int i=0;i<7;i++)
      mp[zw_name[i]]=i;
    for (int i=1;i<=n;i++){
        a[i].id=i;
        cin>>a[i].name>>s;
        a[i].zw=mp[s];
        a[i].bg=read();a[i].level=read();
    }
    sort(a+4,a+n+1,cmp);
    //赋予新职位
    for (int i=4;i<=n;i++)
      for (int j=2;j<7;j++)
        if (i<=num[j]){
            a[i].zw=j;
            break;
        }
    sort(a+1,a+n+1,cmp_);
    for (int i=1;i<=n;i++)
      cout<<a[i].name<<' '<<zw_name[a[i].zw]<<' '<<a[i].level<<endl;
    return 0;
}