1 条题解
-
0
自动搬运
来自洛谷,原作者为

翼德天尊
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
- 上传者