1 条题解

  • 0
    @ 2025-8-24 21:30:20

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 翼德天尊
    2019-09-26 ~ 2024-03-03

    搬运于2025-08-24 21:30:20,当前版本为作者最后更新于2020-03-09 20:50:16,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

    怎么排?

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

    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,但你看得这么认真,点个赞加个油吧!

    • 1

    信息

    ID
    759
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者