提交时间:2025-01-26 20:37:03

运行 ID: 60582

#include<bits/stdc++.h> using namespace std; struct Student { int id; int math; int chinese; int english; int total; }; Student stu[300],tmp[100]; void mergeSort(int left, int right) { if(left == right) return; int mid = (left + right) / 2; // 对两个子序列分别进行归并排序 mergeSort(left, mid); mergeSort(mid+1, right); // 合并两个有序子序列为一个有序序列 int i = left, j = mid+1, index = left; //只要两个子序列都有剩余元素没有遍历 while(i <= mid && j <= right) { // ① 总分高的,先存储 // ② 总分相同,语文成绩高的,先存储 // ③ 总分、语文成绩相同,学号小的,先存储 bool b1 = stu[i].total > stu[j].total; bool b2 = (stu[i].total == stu[j].total) && (stu[i].chinese > stu[j].chinese); bool b3 = (stu[i].total == stu[j].total) && (stu[i].chinese == stu[j].chinese) && (stu[i].id < stu[j].id); if(b1 || b2 || b3) { tmp[index].id = stu[i].id; tmp[index].total = stu[i].total; index ++; i ++; } else { tmp[index].id = stu[j].id; tmp[index].total = stu[j].total; index ++; j ++; } } //若其中一个子序列中还有剩余元素,依次存入 while(i <= mid) //第一个子序列剩余 { tmp[index].id = stu[i].id; tmp[index].total = stu[i].total; index ++; i ++; } while(j <= right) { tmp[index].id = stu[j].id; tmp[index].total = stu[j].total; index ++; j ++; } // 排好序的元素依次复制到原数组中 for(int i = left; i <= right; i ++) { stu[i].id = tmp[i].id; stu[i].total = tmp[i].total; } return; } int main(){ int n; cin>>n; for(int i = 0; i < n; i ++) { cin>>stu[i].chinese>>stu[i].math>>stu[i].english; stu[i].id = i + 1; stu[i].total = stu[i].chinese + stu[i].math + stu[i].english; } mergeSort(0,n-1); //所有学生按照年龄降序排序 for(int i = 0; i < 5; i ++) cout<<stu[i].id<<" "<<stu[i].total<<endl; return 0; }