本题的描述十分抽象,需要仔细读题
我们根据贡献进行完第一次排序后,分配职位,此时相同职位内的顺序是按照贡献度排序的,但是我们希望相同职位内的排序是按照等级——经验(也就是输入顺序)排序的,因此我们需要进行第二次排序。
经验的排序很容易漏掉,在本题中贡献度与等级、经验均无关。在同一职位内,贡献度高的有可能会有更低的经验,反而需要排到后面输出。
附AC代码(写法非常烂,不建议参考)
#include<iostream>
#include<string>
using namespace std;
struct Ren {
string name;
string zhiwei;
int gong;
int ji;
int jinyan;
};
Ren ren[120];
void solution() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> ren[i].name >> ren[i].zhiwei >> ren[i].gong >> ren[i].ji;
ren[i].jinyan = 200 - i;//先输入的经验高
}
//降序的冒泡排序,完成贡献排位
for (int i = n - 1; i >= 3; i--) {
for (int j = 3; j < i; j++) {
if (ren[j].gong < ren[j + 1].gong) {
swap(ren[j], ren[j + 1]);
}
}
}
//在每一个职位内部,按照等级排序,等级相同的按照经验继续排序
//副帮主
if (ren[1].ji < ren[2].ji || ren[1].ji == ren[2].ji && ren[1].jinyan < ren[2].jinyan) {
swap(ren[1], ren[2]);
}
//护法
if (ren[3].ji < ren[4].ji || ren[3].ji == ren[4].ji && ren[3].jinyan < ren[4].jinyan) {
swap(ren[3], ren[4]);
}
//长老
for (int i = 1; i <= 4; i++) {
for (int j = 5; j <= 8 - 1 && j < n - 1; j++) {
if (ren[j].ji < ren[j + 1].ji || ren[j].ji == ren[j + 1].ji && ren[j].jinyan < ren[j + 1].jinyan) {
swap(ren[j], ren[j + 1]);
}
}
}
//堂主
for (int i = 1; i <= 7; i++) {
for (int j = 9; j <= 8 + 7 - 1 && j < n - 1; j++) {
if (ren[j].ji < ren[j + 1].ji || ren[j].ji == ren[j + 1].ji && ren[j].jinyan < ren[j + 1].jinyan) {
swap(ren[j], ren[j + 1]);
}
}
}
//精英
for (int i = 1; i <= 25; i++) {
for (int j = 16; j <= 39 && j < n - 1; j++) {
if (ren[j].ji < ren[j + 1].ji || ren[j].ji == ren[j + 1].ji && ren[j].jinyan < ren[j + 1].jinyan) {
swap(ren[j], ren[j + 1]);
}
}
}
//帮众
for (int i = 1; i <= n; i++) {
for (int j = 41; j < n - 1; j++) {
if (ren[j].ji < ren[j + 1].ji || ren[j].ji == ren[j + 1].ji && ren[j].jinyan < ren[j + 1].jinyan) {
swap(ren[j], ren[j + 1]);
}
}
}
//输出结果
//帮主和两个副帮主是不需要变的
for (int i = 0; i <= 2; i++) {
cout << ren[i].name << ' ' << ren[i].zhiwei << ' ' << ren[i].ji << endl;
}
for (int i = 3; i < n; i++) {
if (i <= 4) {
cout << ren[i].name << ' ' << "HuFa" << ' ' << ren[i].ji << endl;
}
else if (i <= 4 + 4) {
cout << ren[i].name << ' ' << "ZhangLao" << ' ' << ren[i].ji << endl;
}
else if (i <= 8 + 7) {
cout << ren[i].name << ' ' << "TangZhu" << ' ' << ren[i].ji << endl;
}
else if (i <= 8 + 7 + 25) {
cout << ren[i].name << ' ' << "JingYing" << ' ' << ren[i].ji << endl;
}
else {
cout << ren[i].name << ' ' << "BangZhong" << ' ' << ren[i].ji << endl;
}
}
}
int main() {
int n = 1;
//cin>>n;
while (n--) {
solution();
}
}