【PAT甲级】1012 The Best Rank (25 分)

题意:

输入两个整数N,M(<=2000),接着分别输入N个学生的ID,C语言成绩,数学成绩和英语成绩。

M次询问,每次输入学生ID,如果该ID不存在则输出N/A,存在则输出该学生排名最考前的一门成绩的名次和课程编号。优先级:A>C>M>E。A代表CMD三门课的平均成绩(操作时可用总成绩来替代平均成绩处理)。

trick:

成绩相同时将其名次合并(多个学生并列)

AAAAAccepted code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string s[2007];
 4 int c[2007],m[2007],e[2007],a[2007];
 5 pair<int,int>cc[2007],mm[2007],ee[2007],aa[2007];
 6 int rak[2007],rak_c[2007],rak_m[2007],rak_e[2007],rak_a[2007];
 7 char ans[2007];
 8 map<string,int>mp;
 9 bool cmp(pair<int,int>a,pair<int,int>b){
10     return a.first>b.first;
11 }
12 int main(){
13     int n,q;
14     cin>>n>>q;
15     for(int i=1;i<=n;++i){
16         cin>>s[i]>>c[i]>>m[i]>>e[i];
17         a[i]=c[i]+m[i]+e[i];
18         cc[i].first=c[i];
19         cc[i].second=i;
20         mm[i].first=m[i];
21         mm[i].second=i;
22         ee[i].first=e[i];
23         ee[i].second=i;
24         aa[i].first=a[i];
25         aa[i].second=i;
26         mp[s[i]]=i;
27     }
28     sort(cc+1,cc+1+n,cmp);
29     sort(mm+1,mm+1+n,cmp);
30     sort(ee+1,ee+1+n,cmp);
31     sort(aa+1,aa+1+n,cmp);
32     for(int i=1;i<=n;++i){
33         rak_c[i]=i;
34         if(cc[i].first==cc[i-1].first)
35             rak_c[i]=rak_c[i-1];
36         rak_m[i]=i;
37         if(mm[i].first==mm[i-1].first)
38             rak_m[i]=rak_m[i-1];
39         rak_e[i]=i;
40         if(ee[i].first==ee[i-1].first)
41             rak_e[i]=rak_e[i-1];
42         rak_a[i]=i;
43         if(aa[i].first==aa[i-1].first)
44             rak_a[i]=rak_a[i-1];
45     }
46     for(int i=1;i<=n;++i){
47         rak[aa[i].second]=rak_a[i];
48         ans[aa[i].second]='A';
49     }
50     for(int i=1;i<=n;++i)
51         if(rak_c[i]<rak[cc[i].second]){
52             rak[cc[i].second]=rak_c[i];
53             ans[cc[i].second]='C';
54         }
55     for(int i=1;i<=n;++i)
56         if(rak_m[i]<rak[mm[i].second]){
57             rak[mm[i].second]=rak_m[i];
58             ans[mm[i].second]='M';
59         }
60     for(int i=1;i<=n;++i)
61         if(rak_e[i]<rak[ee[i].second]){
62             rak[ee[i].second]=rak_e[i];
63             ans[ee[i].second]='E';
64         }
65     string quy;
66     for(int i=1;i<=q;++i){
67         cin>>quy;
68         if(!mp[quy])
69             cout<<"N/A"<<"\n";
70         else
71             cout<<rak[mp[quy]]<<" "<<ans[mp[quy]]<<"\n";
72     }
73     return 0;
74 }

 

 

 

posted @ 2019-07-24 19:25  sewage  阅读(139)  评论(0编辑  收藏  举报