洛谷刷题10:帮贡排序(P1786)

题目背景

在absi2011的帮派里,死号偏多。现在absi2011和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。

题目描述

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

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

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

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

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

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

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

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

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1
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
输出 #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
题目不难,但还是有点麻烦的,本题自己学到的是如何更好的利用sort函数,并且自己编写排序方法,如何在排序时有若干个关键字时,依照各关键字的权重来排序
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<math.h>
#include<cstring>
#include<cstdio>
#include<cctype>
using namespace std;
struct fight
{
    string name;
    string position;
    long long contribution;
    int grade;
    int serial_number;
}a[100000];
bool cmp1(fight a, fight b)
{
    if (a.contribution == b.contribution)return a.serial_number < b.serial_number;
    else return a.contribution > b.contribution;
}
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;
}
bool cmp2(fight a, fight b)
{
    if (a.position == b.position)
    {
        if (a.grade == b.grade)return a.serial_number < b.serial_number;
        else return a.grade > b.grade;
    }
    else
        return change(a.position) < change(b.position);
}
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i].name >> a[i].position >> a[i].contribution >> a[i].grade;
        a[i].serial_number = i;
    }
    sort(a + 3, a + n, cmp1);
    for (int i = 0; i < n; i++) {
        if (i == 0) a[i].position = "BangZhu";
        else if (i == 1 || i == 2) a[i].position = "FuBangZhu";
        else if (i == 3 || i == 4) a[i].position = "HuFa";
        else if (i >= 5 && i <= 8) a[i].position = "ZhangLao";
        else if (i >= 9 && i <= 15) a[i].position = "TangZhu";
        else if (i >= 16 && i <= 40) a[i].position = "JingYing";
        else a[i].position = "BangZhong";
    }
    sort(a, a + n, cmp2);
    for (int i = 0; i < n; i++)
        cout << a[i].name << " " << a[i].position << " " << a[i].grade << endl;
}

 

精髓在于:
bool cmp1(fight a, fight b)
{
    if (a.contribution == b.contribution)return a.serial_number < b.serial_number;
    else return a.contribution > b.contribution;
}

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;
}
bool cmp2(fight a, fight b)
{
    if (a.position == b.position)
    {
        if (a.grade == b.grade)return a.serial_number < b.serial_number;
        else return a.grade > b.grade;
    }
    else
        return change(a.position) < change(b.position);
}

 

 

 
posted @ 2021-02-04 09:19  _翩若惊鸿  阅读(121)  评论(0编辑  收藏  举报