题意:
输入一个正整数N(N<=100),表示接下来有N组数据。每组数据先输入一个正整数M(M<=300),表示有300名考生,接下来M行每行输入一个考生的ID和分数,ID由13位整数组成。求输出所有考生的数量并且按照考生在全体中的成绩排名以及ID的字典序输出ID和名词,并标注考生所在的考场编号以及他在考场中的排名。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 map<string,int>mp; 5 typedef struct anss{ 6 string s; 7 int final_rank; 8 int local_num; 9 int local_rank; 10 }; 11 anss ans[30007]; 12 typedef struct testee{ 13 string num; 14 int score; 15 }; 16 testee t[107][307]; 17 testee a[30007]; 18 bool cmp(testee a,testee b){ 19 return a.score>b.score; 20 } 21 bool cmp1(anss a,anss b){ 22 if(a.final_rank!=b.final_rank) 23 return a.final_rank<b.final_rank; 24 return a.s<b.s; 25 } 26 int cnt[107]; 27 int main(){ 28 int n; 29 cin>>n; 30 int tt=0; 31 int tot=0; 32 for(int i=1;i<=n;++i){ 33 int m; 34 cin>>m; 35 cnt[i]=m; 36 for(int j=1;j<=m;++j){ 37 string s; 38 int x; 39 cin>>s>>x; 40 t[i][j].num=s; 41 t[i][j].score=x; 42 a[++tot].num=s; 43 a[tot].score=x; 44 mp[s]=++tt; 45 ans[tt].s=s; 46 ans[tt].local_num=i; 47 } 48 } 49 for(int i=1;i<=n;++i){ 50 sort(t[i]+1,t[i]+1+cnt[i],cmp); 51 int no=0; 52 int tmp=1; 53 ans[mp[t[i][1].num]].local_rank=++no; 54 for(int j=2;j<=cnt[i];++j) 55 if(t[i][j].score!=t[i][j-1].score){ 56 ans[mp[t[i][j].num]].local_rank=++no; 57 tmp=no; 58 } 59 else{ 60 ans[mp[t[i][j].num]].local_rank=tmp; 61 ++no; 62 } 63 } 64 int sum=0; 65 for(int i=1;i<=n;++i) 66 sum+=cnt[i]; 67 sort(a+1,a+1+sum,cmp); 68 int no=0; 69 int tmp=1; 70 ans[mp[a[1].num]].final_rank=++no; 71 for(int i=2;i<=sum;++i) 72 if(a[i].score!=a[i-1].score){ 73 ans[mp[a[i].num]].final_rank=++no; 74 tmp=no; 75 } 76 else{ 77 ans[mp[a[i].num]].final_rank=tmp; 78 ++no; 79 } 80 sort(ans+1,ans+1+sum,cmp1); 81 cout<<sum<<" "; 82 for(int i=1;i<=sum;++i) 83 cout<<ans[i].s<<" "<<ans[i].final_rank<<" "<<ans[i].local_num<<" "<<ans[i].local_rank<<" "; 84 return 0; 85 }