60分可能的错误所在
  • 板块P1786 帮贡排序
  • 楼主Ra1_n
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/23 00:07
  • 上次更新2025/1/23 10:38:47
查看原帖
60分可能的错误所在
1283597
Ra1_n楼主2025/1/23 00:07

本题的描述十分抽象,需要仔细读题

我们根据贡献进行完第一次排序后,分配职位,此时相同职位内的顺序是按照贡献度排序的,但是我们希望相同职位内的排序是按照等级——经验(也就是输入顺序)排序的,因此我们需要进行第二次排序。

经验的排序很容易漏掉,在本题中贡献度与等级、经验均无关。在同一职位内,贡献度高的有可能会有更低的经验,反而需要排到后面输出。

附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();
	}
}
2025/1/23 00:07
加载中...