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

AC记录

AC记录,34ms,680.00KB

posted @ 2025-02-17 19:18  2789617221guo  阅读(24)  评论(0)    收藏  举报