原题链接
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