原题链接1025 PAT Ranking
题目大意 给定N个考点的学生注册号码和成绩,合并所有考点的数据并排序。
注意 当两个学生的成绩相等时,他们的排名也必须是一样的,并且在排序的时候也要按他们的注册号码排序。
--实现比较器时,比较大小要用“>",不要用">=",否则最后一个测试点会报运行错误
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
struct node{
string renum;
int lnum, lrank, grade;
};
bool cmp(node n1, node n2){
if(n1.grade>n2.grade)
return true;
else if(n1.grade==n2.grade){
return n1.renum<n2.renum;
}
else
return false;
}
vector<node> loc, final;
int main(){
int n, k, fsize=0;
scanf("%d\n", &n);
for(int i=0;i<n;i++){
scanf("%d\n", &k);
loc.resize(k);
final.resize(k+fsize);
fsize = final.size();
for(int j=0;j<k;j++){
cin>>loc[j].renum;
scanf("%d\n", &loc[j].grade);
}
sort(loc.begin(), loc.end(), cmp);
int lr = 1;
for(int j=0;j<k;j++){
if(j!=0&&loc[j].grade!=loc[j-1].grade) lr=j+1;
final[fsize-k+j].renum = loc[j].renum;
final[fsize-k+j].grade = loc[j].grade;
final[fsize-k+j].lrank = lr;
final[fsize-k+j].lnum = i+1;
}
loc.clear();
}
sort(final.begin(), final.end(), cmp);
printf("%d\n", final.size());
int frank=1;
for(int i=0;i<final.size();i++){
if(i!=0&&final[i].grade!=final[i-1].grade) frank = i+1;
cout<<final[i].renum;
printf(" %d %d %d\n", frank, final[i].lnum, final[i].lrank);
}
return 0;
}
网友评论