首页 > 其他分享 >洛谷 P1786 帮贡排序 题解

洛谷 P1786 帮贡排序 题解

时间:2022-12-11 21:46:48浏览次数:72  
标签:return level 题解 people else 帮贡 洛谷 排序

原题链接

P1786 帮贡排序

解析

实现方法

一看题:这不就是道排序吗?
但是——
用啥办法呢?
这自带的排序方法,肯定是不能用了
那么我们就来写一个cmp排序函数吧!
但是——
输出排序呢?
所以得再写一个cmp排序函数······

排序

第一个cmp

注意!不能改变帮主和副帮主的职位!
1.先按照帮贡从大到小排序
2.如果帮贡一样,则按照输入顺序排序
可以从输入的时候就编好号,
然后按从大到小排序

第二个cmp

在这途中按照排好帮贡的顺序分发职位;
1.先按现在的职位排序。
可以手编一个职位转变为数字的函数,假设函数职位越大返回值越小,那么就从小到大排序。
(由于帮主和副帮主职位肯定更大,所以不需要考虑absi2011的权限问题)
2.职位一样,按照等级从大到小排序
3.如果等级一样,则按照输入顺序排序
可以从输入的时候就编好号,
然后按从大到小排序

具体代码实现

1.初始化 and 输入

struct people {
	string name, before, now; //名称,原来的职位,现在的职位
	long long xp; //帮贡(十年OI一场空,不开long long见祖宗)
	int level, id; //等级,输入顺序
};
struct people a[120]; //结构体の数组
cin >> n;
for (int i = 1; i <= n; i++) {
	cin >> a[i].name >> a[i].before >> a[i].xp >> a[i].level;
	a[i].id = i; //提前编号
}

2.第一个cmp

bool cmp1(people a, people b) {
	if (a.xp == b.xp) return a.id < b.id; //如果帮贡一样,按照输入顺序排序
	else return a.xp > b.xp; //否则按照帮贡排序
}
sort(a + 4, a + n + 1, cmp1); //主函数内の排序

3.分发职位

for (int i = 1; i <= n; i++) {
	//按照职位的最大人数分发职位
	if (i == 1) a[i].now = "BangZhu";
	else if (i == 2 || i == 3) a[i].now = "FuBangZhu";
	else if (i == 4 || i == 5) a[i].now = "HuFa";
	else if (i >= 6 && i <= 9) a[i].now = "ZhangLao";
	else if (i >= 10 && i <= 16) a[i].now = "TangZhu";
	else if (i >= 17 && i <= 41) a[i].now = "JingYing";
	else a[i].now = "BangZhong";
}

4.第二个cmp and 职位转数字

bool cmp2(people a, people b) {
	if (number(a.now) == number(b.now)) {	//如果现职位一样
		if (a.level == b.level) {
			return a.id < b.id; //如果等级一样,则按照输入顺序排序
		} else {
			return a.level > b.level; //否则按照等级排序
		}
	} else {
		return number(a.now) < number(b.now);  //否则按照现职位排序
	}
}
int number(string x) {
	if (x == "BangZhu") return 1;
	else if (x == "FuBangZhu") return 2;
	else if (x == "HuFa") return 3;
	else if (x == "ZhangLao") return 4;
	else if (x == "TangZhu") return 5;
	else if (x == "JingYing") return 6;
	else if (x == "BangZhong") return 7;
}
sort(a + 1, a + n + 1, cmp2);

AC Code

#include <iostream>
#include <algorithm>
using namespace std;

struct people {
	string name, before, now; //名称,原来的职位,现在的职位
	long long xp; //帮贡(十年OI一场空,不开long long见祖宗)
	int level, id; //等级,输入顺序
};
struct people a[120]; //结构体の数组

int n;

int number(string x) {
	if (x == "BangZhu") return 1;
	else if (x == "FuBangZhu") return 2;
	else if (x == "HuFa") return 3;
	else if (x == "ZhangLao") return 4;
	else if (x == "TangZhu") return 5;
	else if (x == "JingYing") return 6;
	else if (x == "BangZhong") return 7;
}

bool cmp1(people a, people b) {
	if (a.xp == b.xp) return a.id < b.id; //如果帮贡一样,按照输入顺序排序
	else return a.xp > b.xp; //否则按照帮贡排序
}

bool cmp2(people a, people b) {
	if (number(a.now) == number(b.now)) {	//如果现职位一样
		if (a.level == b.level) {
			return a.id < b.id; //如果等级一样,则按照输入顺序排序
		} else {
			return a.level > b.level; //否则按照等级排序
		}
	} else {
		return number(a.now) < number(b.now);  //否则按照现职位排序
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].name >> a[i].before >> a[i].xp >> a[i].level;
		a[i].id = i; //提前编号
	}

	sort(a + 4, a + n + 1, cmp1);

	for (int i = 1; i <= n; i++) {
		//按照职位的最大人数分发职位
		if (i == 1) a[i].now = "BangZhu";
		else if (i == 2 || i == 3) a[i].now = "FuBangZhu";
		else if (i == 4 || i == 5) a[i].now = "HuFa";
		else if (i >= 6 && i <= 9) a[i].now = "ZhangLao";
		else if (i >= 10 && i <= 16) a[i].now = "TangZhu";
		else if (i >= 17 && i <= 41) a[i].now = "JingYing";
		else a[i].now = "BangZhong";
	}

	sort(a + 1, a + n + 1, cmp2);

	for (int i = 1; i <= n; i++) {
		cout << a[i].name << ' ' << a[i].now << ' ' << a[i].level << endl;
	}

	//system("pause");
	return 0;
}

标签:return,level,题解,people,else,帮贡,洛谷,排序
From: https://www.cnblogs.com/hemuxuan0709/p/P1786.html

相关文章

  • 题解 洛谷 P2885 [USACO07NOV]Telephone Wire G
    1.题面描述题目链接给出\(n\)棵树的高度。你可以进行任意次操作,每次操作形如:把某棵树增高\(x\),代价为\(x^2\)(注意:不能将一棵树的高度减少)。在操作完之后,一个状态......
  • 题解 洛谷 P3594 [POI2015] WIL
    1.题面描述题目链接给定一个长度为\(n\)的序列,你有一次机会选中一段连续的长度不超过\(d\)的区间,将里面所有数字全部修改为\(0\)。请找到最长的一段连续区间,使得该......
  • 题解 CodeForces 940E Cashback
    1.题面描述题目链接给定长为\(n\)的序列和一个整数\(c\),你需要将其分为若干段。对于每一段,若其长度为\(k\),则可以删除其中前\(\lfloor\frac{k}{c}\rfloor\)小的......
  • 题解 洛谷 P3793 由乃救爷爷
    1.题面描述题目链接给定长为\(n\)的序列,\(m\)次询问,查询区间最大值。\(n,m\le10^7\),数据随机。2.分析经典的静态区间最小值问题,经典题目配经典算法,考虑到ST表......
  • NOIP2022 题解
    A.种花枚举\((x_2,y_0)\),考虑\(x_1\)可能在哪些位置,显然是在\(x_2\)往上的一个极长连续0段上。考虑如果固定了\(x_1\)的位置后怎么计算C形的数量,我们预处理......
  • CF1182E 题解
    前言题目传送门!更好的阅读体验?\(\text{zltqwq}\)推荐矩阵快速幂题目。思路......
  • P4902 乘积 题解
    乘积给出\(A\),\(B\),求下面的式子的值.\[\prod_{i=A}^{B}\prod_{j=1}^{i}(\frac{i}{j})^{\left\lfloor\frac{i}{j}\right\rfloor}\(\bmod\19260817)\]包含\(T\)组......
  • 【题解】CF1764C Doremy's City Construction
    题目传送门思路首先我们思考一个性质,由于不能有连续单调不升/不降的三个点连在一起,所以对于单个点来讲,显然要么只和比它大的连边(称为A类点),要么只和比它小的连边(称为B类点......
  • SP8547 题解
    SP8547题解题意简述:给定\(n\),找到能够使得辗转相除法执行\(n\)次的两个数,使得这两个数的和最小,输出这两个数。\(n\le10^{18}\)分析:对于这种题,一看就是猜结论的题,因......
  • [NOIP2022] 喵了个喵 题解
    [NOIP2022]喵了个喵题解先考虑\(k=2n-2\),这个数字提示我们每个栈放两种颜色,剩下一个栈辅助操作。那么颜色被分为两类在栈底,可以通过操作2消去。在栈顶,可以通过操作1......