【洛谷】每日一题-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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值