【PAT甲级】1025 PAT Ranking (25 分)(结构体排序,MAP<string,int>映射)

题意:

输入一个正整数N(N<=100),表示接下来有N组数据。每组数据先输入一个正整数M(M<=300),表示有300名考生,接下来M行每行输入一个考生的ID和分数,ID由13位整数组成。求输出所有考生的数量并且按照考生在全体中的成绩排名以及ID的字典序输出ID和名词,并标注考生所在的考场编号以及他在考场中的排名。

代码:

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
map<string,int>mp;
typedef struct anss{
string s;
int final_rank;
int local_num;
int local_rank;
};
anss ans[30007];
typedef struct testee{
string num;
int score;
};
testee t[107][307];
testee a[30007];
bool cmp(testee a,testee b){
return a.score>b.score;
}
bool cmp1(anss a,anss b){
if(a.final_rank!=b.final_rank)
return a.final_rank<b.final_rank;
return a.s<b.s;
}
int cnt[107];
int main(){
int n;
cin>>n;
int tt=0;
int tot=0;
for(int i=1;i<=n;++i){
int m;
cin>>m;
cnt[i]=m;
for(int j=1;j<=m;++j){
string s;
int x;
cin>>s>>x;
t[i][j].num=s;
t[i][j].score=x;
a[++tot].num=s;
a[tot].score=x;
mp[s]=++tt;
ans[tt].s=s;
ans[tt].local_num=i;
}
}
for(int i=1;i<=n;++i){
sort(t[i]+1,t[i]+1+cnt[i],cmp);
int no=0;
int tmp=1;
ans[mp[t[i][1].num]].local_rank=++no;
for(int j=2;j<=cnt[i];++j){
if(t[i][j].score!=t[i][j-1].score){
ans[mp[t[i][j].num]].local_rank=++no;
tmp=no;
}
else{
ans[mp[t[i][j].num]].local_rank=tmp;
++no;
}
}
}
int sum=0;
for(int i=1;i<=n;++i)
sum+=cnt[i];
sort(a+1,a+1+sum,cmp);
int no=0;
int tmp=1;
ans[mp[a[1].num]].final_rank=++no;
for(int i=2;i<=sum;++i){
if(a[i].score!=a[i-1].score){
ans[mp[a[i].num]].final_rank=++no;
tmp=no;
}
else{
ans[mp[a[i].num]].final_rank=tmp;
++no;
}
}
sort(ans+1,ans+1+sum,cmp1);
cout<<sum<<"\n";
for(int i=1;i<=sum;++i)
cout<<ans[i].s<<" "<<ans[i].final_rank<<" "<<ans[i].local_num<<" "<<ans[i].local_rank<<"\n";
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11453192.html