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

题意:

输入一个正整数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 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11453192.html