这一版更直接,哪些情况不需要交换,把情况列举出来,return true,其他情况return false都需要交换,参考KY1成绩排序,成绩不同按成绩降序或升序排序,成绩相同按输入顺序排序,为了实现稳定排序,需要增加一个类似seq表示顺序的属性保证稳定性
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool isLetter(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
// bool cmp(const pair<int, char>& a, const pair<int, char>& b) {
// char lowerA = tolower(a.second);
// char lowerB = tolower(b.second);
// if (lowerA != lowerB) {
// return lowerA < lowerB; // 按字母顺序排序
// } else {
// return a.first < b.first; // 字母相同时按原位置排序
// }
// }
bool cmp(const pair<int, char>& a, const pair<int, char>& b){
char lowerA = tolower(a.second);
char lowerB = tolower(b.second);
if(lowerA < lowerB){
return true;
}else if(lowerA == lowerB && a.first < b.first){
return true;
}else{
return false;
}
}
int main() {
string input;
while (getline(cin, input)) {
vector<pair<int, char>> letters;
// 提取所有字母及其位置
for (int i = 0; i < input.size(); i++) {
if (isLetter(input[i])) {
letters.push_back({i, input[i]});
}
}
// 按规则排序字母
sort(letters.begin(), letters.end(), cmp);
// 重构字符串
int cnt = 0;
for (int i = 0; i < input.size(); i++) {
if (isLetter(input[i])) {
input[i] = letters[cnt++].second;
}
}
cout << input << endl;
}
return 0;
}
#include <cstdio>
#include <algorithm>
using namespace std;
struct Student {
char name[50];
int grade;
int seq; // 记录录入的顺序,相同成绩都按先录入排列在前的规则处理
};
// 输入0代表降序
bool comp_0(Student lhs, Student rhs) {
if (lhs.grade > rhs.grade) {
return true;
}
else if (lhs.grade == rhs.grade && lhs.seq < rhs.seq) {
return true;
}
else // seq越大,说明来得越晚,如果与前面成绩相同,不予交换
return false;
}
// 输入1代表升序
bool comp_1(Student lhs, Student rhs) {
if (lhs.grade < rhs.grade) {
return true;
}
else if (lhs.grade == rhs.grade && lhs.seq < rhs.seq) {
return true;
}
else
return false;
}
int main() {
int N, order;
Student arr[10000];
while (scanf("%d%d", &N, &order) != EOF) {
int seq = 0;
for (int i = 0; i < N; ++i) {
scanf("%s%d", arr[i].name, &arr[i].grade);
arr[i].seq = seq;
++seq; // 每次读取后自增
}
if (0 == order) {
sort(arr, arr + N, comp_0);
}
else if (1 == order) {
sort(arr, arr + N, comp_1);
}
for (int i = 0; i < N; ++i) {
printf("%s %d\n", arr[i].name, arr[i].grade);
}
}
return 0;
}

京公网安备 11010502036488号