洛谷P1786 帮贡排序 题解
洛谷P1786 帮贡排序 题解
思路
使用结构体定义类型 person 表示一个人,结构体内成员变量需包含名字、职位、帮贡、等级、输入顺序(即ID),用 2 次 sort 排序将 person 数组排序。
第一次排序:cmp1
cmp1 是第一次排序时的自定义比较函数(用法如:sort(p+1,p+1+n,cmp1)
),需要考虑的易错点有帮主及副帮主无需参与排序(解决方法:在排序时将 begin 指针后移 3 个元素)以及当 2 人帮贡相同时需要按照输入顺序排序。
cmp1 代码
bool cmp1(person p1, person p2) {
if(p1.banggong == p2.banggong) {
return p1.id < p2.id;
}
return p1.banggong > p2.banggong;
}
第二次排序:cmp2
cmp2 是第二次排序时的自定义比较函数,需要考虑的易错点有帮主及副帮主无需参与排序(同 cmp1)、当 2 人帮贡相同时需比较等级以及当 2 人帮贡、等级皆相同时需要按照输入顺序排序。
cmp2 代码
bool cmp2(person p1, person p2) {
if(getJob(p1.career) == getJob(p2.career)) {
if(p1.level == p2.level) return p1.id < p2.id;
return p1.level > p2.level;
}
return getJob(p1.career) < getJob(p2.career);
}
余下的就是一些简单的模拟操作了。
代码
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
struct person {
string name;
string career;
int id;
long long banggong;
long long level;
} p[120];
int n;
string job[120] = {"", "BangZhu", "FuBangZhu", "FuBangZhu", "HuFa", "HuFa", "ZhangLao", "ZhangLao", "ZhangLao", "ZhangLao", "TangZhu", "TangZhu", "TangZhu", "TangZhu", "TangZhu", "TangZhu", "TangZhu", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing", "JingYing"};
int getJob(string a) {
if(a == "BangZhu") return 1;
if(a == "FuBangZhu") return 2;
if(a == "HuFa") return 3;
if(a == "ZhangLao") return 4;
if(a == "TangZhu") return 5;
if(a == "JingYing") return 6;
return 7;
}
bool cmp1(person p1, person p2) {
if(p1.banggong == p2.banggong) {
return p1.id < p2.id;
}
return p1.banggong > p2.banggong;
}
bool cmp2(person p1, person p2) {
if(getJob(p1.career) == getJob(p2.career)) {
if(p1.level == p2.level) return p1.id < p2.id;
return p1.level > p2.level;
}
return getJob(p1.career) < getJob(p2.career);
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> p[i].name >> p[i].career >> p[i].banggong >> p[i].level;
p[i].id = i;
}
sort(p + 4, p + 1 + n, cmp1);
int start = 0, end = 0;
bool b = 0;
for(int i = 1; i <= n; i++) {
if(i > 41) p[i].career = "BangZhong";
else p[i].career = job[i];
}
sort(p + 4, p + 1 + n, cmp2);
for(int i = 1; i <= n; i++) cout << p[i].name << " " << p[i].career << " " << p[i].level << endl;
return 0;
}