PAT 1012 The Best Rank
这一题主要是用哈希表+排序,类似的方法在之前的题目中也涉及到了
PAT 1009 Product of Polynomials
但这一题比较复杂的点在于,我们需要先找一个学生每科成绩的排名,再找在它每科成绩排名中,找出最优的排名,优先级是A>C>M>E。
大模拟法来一步步写。
需要注意的有两个点:
1.算平均成绩的时候需要四舍五入
2.要注意有分数相同的情况下,排名一样。
完整代码如下:
#include <iostream>
#include <limits.h>
#include <cstring>
#include <queue>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
unordered_map<string,vector<int>> mp;
unordered_map<string,vector<int>> ranks;
int N;
int M;
bool cmp(pair<string,int> a,pair<string,int> b)
{if(a.second>b.second){return true;}else{return false;}
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>N>>M;for(int i=0;i<N;i++){string id;int avg;int c;int m;int e;cin>>id>>c>>m>>e;avg=(int)((c+m+e)/3.0+0.5);mp[id]={avg,c,m,e};}vector<pair<string,int>> v;for(int i=0;i<4;i++){vector<pair<string,int>> v;for(auto it: mp){v.push_back({it.first,it.second[i]});} //这样你就得出了一个需要排序的pairsort(v.begin(),v.end(),cmp); //那么就可以根据这个排序情况来判断它这个排名for(int j=0;j<v.size();j++){int rank=1;if(j!=0&&v[j].second==v[j-1].second){rank=j;}else{rank=j+1;}ranks[v[j].first].resize(4);ranks[v[j].first][i]=rank; }}//这样就把所有的学生的各科的排名得出来了 //针对一个学生,我们要找到它的最强的rank//得出它最强rank从而输出最强rank对应的//学科int bestrank;for(int i=0;i<M;i++){string id;cin>>id;if(!ranks.count(id)){cout<<"N/A"<<endl;}else{int bestrank=ranks[id][0];char bestname='A';//找最佳的排名for(int j=1;j<ranks[id].size();j++){if(bestrank>ranks[id][j]){bestrank=ranks[id][j];if(j==1){bestname='C';}else if(j==2){bestname='M';}else{bestname='E';}}}cout<<bestrank<<" "<<bestname<<endl;}}return 0;}
时间复杂度为O(NlogN+M)