排序本身非常简单,但测试样例很刁钻。
根据示例2就知道,本题的输入并不是进行过一次就会结束的;因此需要采用持续检测输入的方法。可以将每一行的输入内容分别读取进2个数组,随后以存储成绩的数组中的数值作比较,并根据这个数值所对应的指针(在数组中的序号)对其他数组中对应的内容进行交换。
这题看上去用冒泡排序处理分数数组就可以解决了。然而,在测试用例1中有多个拥有相同分数的学生;如果仅用两个数组并不能保持输入时这些同分学生的顺序。因此,考虑开出新的存储“学号”的数组来保证排序结果的“输入顺序优先”。
#include <bits/stdc++.h>
#define _CRT_SECURE_NO_DEPRECATE
int main() {
int caseCount, modeFlag;
while (std::cin >> caseCount >> modeFlag) {
std::vector<std::string> name(caseCount);
std::vector<int> index(caseCount);
std::vector<int> score(caseCount);
for (int i = 0; i < caseCount; i++) {
std::cin >> name[i] >> score[i];
index[i] = i;
}
if (modeFlag) {
//升序
for (int i = 0; i < caseCount - 1; i++) {
for (int j = i + 1; j < caseCount; j++) {
if (score[i] > score[j] || (score[i] == score[j] && index[i] > index[j])) {
std::swap(score[i], score[j]);
std::swap(name[i], name[j]);
std::swap(index[i], index[j]);
}
}
}
for (int i = 0; i < caseCount; i++) {
std::cout << name[i] << " " << score[i] << std::endl;
}
} else {
//降序
for (int i = 0; i < caseCount - 1; i++) {
for (int j = i + 1; j < caseCount; j++) {
if (score[i] < score[j] || (score[i] == score[j] && index[i] > index[j])) {
std::swap(score[i], score[j]);
std::swap(name[i], name[j]);
std::swap(index[i], index[j]);
}
}
}
for (int i = 0; i < caseCount; i++) {
std::cout << name[i] << " " << score[i] << std::endl;
}
}
}
return 0;
}