PAT A1025 Ranking 【排序】25
解题思路
1 用结构体Testee记录学生的信息:分数、考场、考号、考场排名、总排名
2 每个考场学生录入结束后,对考场内考生排名,并设置名次
3 所有考场学生录入结束后,对所有考场内考生排名,并设置名次
4 排序规则:按照名次非递减(即按照分数非递增),同名次(即同分数)的考生,按照考号非递减排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Testee {
string id;
int lid; //考场号
int sc; //分数
int rkl; //本地排名
int rka; //总排名
};
bool cmp(Testee &t1,Testee &t2) {
if(t1.sc!=t2.sc)return t1.sc>t2.sc;
else return t1.id<t2.id;
}
void setrkl(vector<Testee>&ts) {
ts[0].rkl=1;
int k = ts.size();
for(int i=1; i<k; i++) {
ts[i].rkl=i+1;
if(ts[i].sc==ts[i-1].sc) {
ts[i].rkl=ts[i-1].rkl;
}
}
}
void setrkall(vector<Testee>&ts) {
ts[0].rka=1;
int k = ts.size();
for(int i=1; i<k; i++) {
ts[i].rka=i+1;
if(ts[i].sc==ts[i-1].sc) {
ts[i].rka=ts[i-1].rka;
}
}
}
int main() {
int n,k;
scanf("%d",&n);
Testee t;
vector<Testee> vts; //本地考生信息
vector<Testee> vtsall; //全部考生信息
for(int i=1; i<=n; i++) {
scanf("%d",&k);
vts.clear();
vts.resize(k);
for(int j=0; j<k; j++) {
cin>>vts[j].id>>vts[j].sc;
vts[j].lid=i; //考场号
// vtsall.push_back(vts[j]); //加入总榜
}
sort(vts.begin(),vts.end(),cmp); //本地排名
setrkl(vts);
vtsall.insert(vtsall.end(),vts.begin(),vts.end());
}
sort(vtsall.begin(),vtsall.end(),cmp); //总榜排名
setrkall(vtsall);
printf("%d\n",vtsall.size());
for(int i=0;i<vtsall.size();i++){
Testee t = vtsall[i];
printf("%s %d %d %d\n",t.id.c_str(),t.rka,t.lid,t.rkl);
}
return 0;
}