洛谷刷题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); }