【洛谷】每日一题-P1786 帮贡排序

原题链接

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.职位转数字

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

5.第二个cmp

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);  //否则按照现职位排序
	}
}
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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值