版权声明:如需转载请联系[email protected] https://blog.csdn.net/qq_20633793/article/details/82114919
思路:
两次排序,一次本地名次,一次总名次,但是没有必要存储两个序列,sort函数可以对特定区间排序,再对整体排序sort(it_lo,it_hi)
笔者第一次做的时候直接将数据存储了多个数组分别排序,每个数据存储了两边,浪费了空间,但是写法上较简单,不用考虑分段排序的下标
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//1025 PAT Ranking (25)
struct node{
long long id;
int score,localnum,localrank,rank;
node(long long ii,int ss,int ll):id(ii),score(ss),localnum(ll){}
bool operator<(node& b){
return score>b.score||(score==b.score&&id<b.id);
}
};
int main(){
//freopen("D:\\input.txt","r",stdin);
int N,K;
scanf("%d",&N);
vector<vector<node>> stu(N+1);//stu[i]表示第i个地区的学生信息
vector<int> num(N+1);//num[i]表示第i个地区的学生数量
int sum=0;//学生总数
long long id;
int score;
vector<node> ans;
for(int i=1;i<=N;i++){
scanf("%d",&num[i]);
sum+=num[i];
for(int j=0;j<num[i];j++){
scanf("%lld %d",&id,&score);
stu[i].push_back(node(id,score,i));
ans.push_back(stu[i][j]);
}
sort(stu[i].begin(),stu[i].end());
stu[i][0].localrank=1;
for(int j=1;j<num[i];j++){
if(stu[i][j].score==stu[i][j-1].score)
stu[i][j].localrank=stu[i][j-1].localrank;
else
stu[i][j].localrank=j+1;
}
}
sort(ans.begin(),ans.end());
ans[0].rank=1;
for(int i=1;i<sum;i++){
if(ans[i].score==ans[i-1].score)
ans[i].rank=ans[i-1].rank;
else ans[i].rank=i+1;
}
printf("%d\n",sum);
for(int i=0;i<sum;i++)
printf("%013lld %d %d %d\n",ans[i].id,ans[i].rank,ans[i].localnum,ans[i].localrank);
return 0;
}