https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312
3.9改进版本
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
int number;
int de;
int cai;
int total;
int category;
};
bool cmp(student a, student b){
if(a.category != b.category)
return a.category < b.category;
if(a.total != b.total)
return a.total > b.total;
if(a.de != b.de)
return a.de > b.de;
if(a.number != b.number)
return a.number < b.number;
}
int main(){
int n, l, h, k=0;
cin >> n >> l >> h;
student stus[n];
for(int i=0; i<n; i++){
cin >> stus[k].number >> stus[k].de >> stus[k].cai;
if(stus[k].de < l || stus[k].cai < l){
continue;
}
stus[k].total = stus[k].de + stus[k].cai;
if(stus[k].de >= h && stus[k].cai >= h){
stus[k].category = 1;
}else if(stus[k].de >= h && stus[k].cai < h){
stus[k].category = 2;
}else if(stus[k].de < h && stus[k].cai < h && stus[k].de >= stus[k].cai){
stus[k].category = 3;
}else{
stus[k].category = 4;
}
k ++;
}
sort(stus, stus+k, cmp);
cout << k << endl;
for(int i=0; i<k; i++){
cout << stus[i].number << " " << stus[i].de << " " << stus[i].cai << endl;
}
return 0;
}
原版
这题输入每个考生的考号、德分、才分,然后把考生成绩分为四等,每一等要进行排序,即按总分降序排列,总分相同的按德分降序排列,德分相同的按考号升序排列。
我的代码先把考生分进四个数组,对每个数组用快排后再输出。
#include<iostream>
using namespace std;
// 快速排序
void quick_sort(int arr[][3], int l, int r)
{
if (l < r)
{
int i = l, j = r, x[3];
x[0] = arr[l][0];
x[1] = arr[l][1];
x[2] = arr[l][2];
while(i < j){
while(i < j && (arr[j][1]+arr[j][2] < x[1]+x[2] || (arr[j][1]+arr[j][2] == x[1]+x[2] && arr[j][1] < x[1]) || (arr[j][1]+arr[j][2] == x[1]+x[2] && arr[j][1] == x[1] && arr[j][0] > x[0]))){
j--;
}
if(i < j)
{
arr[i][0] = arr[j][0];
arr[i][1] = arr[j][1];
arr[i++][2] = arr[j][2];
}
while(i < j && (arr[i][1]+arr[i][2] > x[1]+x[2] || (arr[i][1]+arr[i][2] == x[1]+x[2] && arr[i][1] > x[1]) || (arr[i][1]+arr[i][2] == x[1]+x[2] && arr[i][1] == x[1] && arr[i][0] < x[0]))){
i++;
}
if(i < j)
{
arr[j][0] = arr[i][0];
arr[j][1] = arr[i][1];
arr[j--][2] = arr[i][2];
}
}
arr[i][0] = x[0];
arr[i][1] = x[1];
arr[i][2] = x[2];
quick_sort(arr, l, i - 1);
quick_sort(arr, i + 1, r);
}
}
int main(){
int n, l, h, a, b, c;
int p1=0, p2=0, p3=0, p4=0;
cin >> n >> l >> h;
int stu1[n][3], stu2[n][3], stu3[n][3], stu4[n][3];
for(int i=0; i<n; i++){
cin >> a >> b >> c;
if(b>=h && c>=h){
stu1[p1][0] = a;
stu1[p1][1] = b;
stu1[p1++][2] = c;
}
else if(b>=h && c>=l){
stu2[p2][0] = a;
stu2[p2][1] = b;
stu2[p2++][2] = c;
}else if(b>=l && c>=l && b>=c){
stu3[p3][0] = a;
stu3[p3][1] = b;
stu3[p3++][2] = c;
}else if(b>=l && c>=l){
stu4[p4][0] = a;
stu4[p4][1] = b;
stu4[p4++][2] = c;
}
}
cout << p1+p2+p3+p4 << endl;
quick_sort(stu1, 0, p1);
quick_sort(stu2, 0, p2);
quick_sort(stu3, 0, p3);
quick_sort(stu4, 0, p4);
for(int i=0;i<p1;i++){
cout << stu1[i][0] << " " << stu1[i][1] << " " << stu1[i][2] << endl;
}
for(int i=0;i<p2;i++){
cout << stu2[i][0] << " " << stu2[i][1] << " " << stu2[i][2] << endl;
}
for(int i=0;i<p3;i++){
cout << stu3[i][0] << " " << stu3[i][1] << " " << stu3[i][2] << endl;
}
for(int i=0;i<p4;i++){
cout << stu4[i][0] << " " << stu4[i][1] << " " << stu4[i][2] << endl;
}
return 0;
}