洛谷刷题C++语言 | P1786 帮贡排序

学习C++从娃娃抓起!记录下洛谷C++学习和备考过程中的题目,记录每一个瞬间。

附上汇总贴:洛谷刷题C++语言 | 汇总_热爱编程的通信人的博客-CSDN博客


【题目描述】

目前帮派内共最多有一位帮主,两位副帮主,两位护法,四位长老,七位堂主,二十五名精英,帮众若干。

现在 absi2011 要对帮派内几乎所有人的职位全部调整一番。他发现这是个很难的事情。于是要求你帮他调整。

他给你每个人的以下数据:

他的名字(长度不会超过 30),他的原来职位,他的帮贡,他的等级。

他要给帮贡最多的护法的职位,其次长老,以此类推。

可是,乐斗的显示并不按帮贡排序而按职位和等级排序。

他要你求出最后乐斗显示的列表(在他调整过职位后):职位第一关键字,等级第二关键字。

注意:absi2011 无权调整帮主、副帮主的职位,包括他自己的(这不是废话么..)

他按原来的顺序给你(所以,等级相同的,原来靠前的现在也要靠前,因为经验高低的原因,但此处为了简单点省去经验。)

【输入】

第一行一个正整数 n,表示星月家园内帮友的人数。

下面 n 行每行两个字符串两个整数,表示每个人的名字、职位、帮贡、等级。

【输出】

一共输出 n 行,每行包括排序后乐斗显示的名字、职位、等级。

【输入样例】

9
DrangonflyKang BangZhu 100000 66
RenZaiJiangHu FuBangZhu 80000 60
absi2011 FuBangZhu 90000 60
BingQiLingDeYanLei HuFa 89000 58
Lcey HuFa 30000 49
BangYou3 ZhangLao 1000 1
BangYou1 TangZhu 100 40
BangYou2 JingYing 40000 10
BangYou4 BangZhong 400 1

【输出样例】

DrangonflyKang BangZhu 66
RenZaiJiangHu FuBangZhu 60
absi2011 FuBangZhu 60
BingQiLingDeYanLei HuFa 58
BangYou2 HuFa 10
Lcey ZhangLao 49
BangYou1 ZhangLao 40
BangYou3 ZhangLao 1
BangYou4 ZhangLao 1

【代码详解】

#include <bits/stdc++.h>
using namespace std;
struct people {
    string name, zw;
    int bg, dj, sx;
}p[115];
bool cmp1(people p1, people p2) 
{
    if (p1.bg != p2.bg) return p1.bg > p2.bg;
    return p1.sx < p2.sx;
}
string its(int n) 
{
    if (n==0) return "BangZhu";
    if (n<=2) return "FuBangZhu";
    if (n<=4) return "HuFa";
    if (n<=8) return "ZhangLao";
    if (n<=15) return "TangZhu";
    if (n<=40) return "JingYing";
    return "BangZhong";
}
int sti(string s) {
    if (s=="BangZhu") return 0;
    if (s=="FuBangZhu") return 1;
    if (s=="HuFa") return 2;
    if (s=="ZhangLao") return 3;
    if (s=="TangZhu") return 4;
    if (s=="JingYing") return 5;
    return 6;
}
bool cmp2(people p1, people p2)
{
    int tmp1 = sti(p1.zw), tmp2 = sti(p2.zw);
    if (tmp1!=tmp2) return tmp1 < tmp2;
    if (p1.dj!=p2.dj) return p1.dj > p2.dj;
    return p1.sx < p2.sx;
}
int main()
{
    int n;
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> p[i].name >> p[i].zw >> p[i].bg >> p[i].dj;
        p[i].sx = i;
    }
    sort(p+3, p+n, cmp1);
    for (int i=0; i<n; i++) p[i].zw = its(i);   
    sort(p+3, p+n, cmp2);
    for (int i=0; i<n; i++) {
        cout << p[i].name << " " << p[i].zw << " " << p[i].dj << endl;
    }
    return 0;
}

【运行结果】

9
DrangonflyKang BangZhu 100000 66
RenZaiJiangHu FuBangZhu 80000 60
absi2011 FuBangZhu 90000 60
BingQiLingDeYanLei HuFa 89000 58
Lcey HuFa 30000 49
BangYou3 ZhangLao 1000 1
BangYou1 TangZhu 100 40
BangYou2 JingYing 40000 10
BangYou4 BangZhong 400 1
DrangonflyKang BangZhu 66
RenZaiJiangHu FuBangZhu 60
absi2011 FuBangZhu 60
BingQiLingDeYanLei HuFa 58
BangYou2 HuFa 10
Lcey ZhangLao 49
BangYou1 ZhangLao 40
BangYou3 ZhangLao 1
BangYou4 ZhangLao 1
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值