#include using namespace std; /* 1.所有信息输入后排序,排序方式如下: (1)先按帮贡排序; (2)如帮贡一样,则按输入顺序排列。 2.再重新编好职位后排输出顺序,也就是职位内的排名,排序方式如下: (1)先按现在的职位排序; (2)如职位相同,再按等级排序; (3)如果恰好等级还破天荒地一样,则按输入顺序排列。 */ const int N = 120; int n; struct Node { string Name, ZhiWei, NewZhiWei;//姓名,职位,修改后职位 long long GongXian;//帮贡 int DengJi, Order;//等级,序号 } s[N]; int get(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.GongXian == y.GongXian) return x.Order < y.Order; return x.GongXian > y.GongXian; } //(1)先按现在的职位排序; //(2)如职位相同,再按等级排序; //(3)如果恰好等级还破天荒地一样,则按输入顺序排列。 int cmp2(Node x, Node y) { if (get(x.NewZhiWei) == get(y.NewZhiWei)) { if (x.DengJi == y.DengJi) return x.Order < y.Order; return x.DengJi > y.DengJi; } return get(x.NewZhiWei) < get(y.NewZhiWei); } int main() { cin >> n; //输入 for (int i = 0; i < n; i++) { cin >> s[i].Name >> s[i].ZhiWei >> s[i].GongXian >> s[i].DengJi; s[i].Order = i; } //因为有一位帮主,两位副帮主,所以,前三名已经被占领,不需要排,只需要把第4位开始的进行排即可。 sort(s + 3, s + n, cmp1); //依题意,重新安排职位 for (int i = 0; i < n; i++) { if (i == 0) s[i].NewZhiWei = "BangZhu"; else if (i == 1 || i == 2) s[i].NewZhiWei = "FuBangZhu"; else if (i == 3 || i == 4) s[i].NewZhiWei = "HuFa"; else if (i >= 5 && i <= 8) s[i].NewZhiWei = "ZhangLao"; else if (i >= 9 && i <= 15) s[i].NewZhiWei = "TangZhu"; else if (i >= 16 && i <= 40) s[i].NewZhiWei = "JingYing"; else s[i].NewZhiWei = "BangZhong"; } //二轮排序 sort(s, s + n, cmp2); //输出结果 for (int i = 0; i < n; i++) cout << s[i].Name << " " << s[i].NewZhiWei << " " << s[i].DengJi << endl; return 0; }