概述
所使用的方法都需要重写比较逻辑,比较逻辑为:
- 成绩不同时,按成绩从小到大拍
- 成绩相同时,按学号从小到大拍
方法1:利用sort函数
//方法1:利用sort
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int N = 1000;
int n;
struct Student
{
int id;
int score;
}stu[N];
bool cmp (const Student s1, const Student s2)
{
if(s1.score != s2.score) return s1.score < s2.score;
else return s1.id < s2.id;
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>stu[i].id>>stu[i].score;
sort(stu, stu+n, cmp);
for(int i=0; i<n; i++)
cout<<stu[i].id<<" "<<stu[i].score<<endl;
return 0;
}
方法2:利用优先队列priority_queue
//方法1:利用sort
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int N = 1000;
int n;
struct Student
{
int id;
int score;
}stu[N];
struct cmp
{
bool operator() (const Student s1, const Student s2)
{
if(s1.score != s2.score) return s1.score > s2.score;
else return s1.id > s2.id;
}
};
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>stu[i].id>>stu[i].score;
priority_queue<Student, vector<Student>, cmp> pq;
for(int i=0; i<n; i++)
pq.push(stu[i]);
while(!pq.empty())
{
cout<<pq.top().id<<" "<<pq.top().score<<endl;
pq.pop();
}
return 0;
}