传送门
这是一道结构体排序问题,只不过排序的条件有点特别,但是我们可以传一个谓词给函数。还有一个坑就是注意俩人排名相同的情况,比如有两人并列第一,实际上分数第二的人排名就是第三了。
/* *********PAT1012***************** *********Author:markliang******** */ #include <iostream> #include <vector> #include <string> #include <algorithm> #include <cstdint> #include <utility> using namespace std; int N,M; struct info{ string name; pair<int,int> score[4]; //save the A C M E score info(string name,pair<int,int> p[]){ this->name=name; for(int i=0;i<4;i++){ score[i].first=p[i].first;score[i].second=p[i].second; } } }; void setRank(vector<info> &v,int cond=0){ int previous=-1; int nowRank=1; for(auto i=0;i<v.size();i++){ if(v[i].score[cond].first!=previous){ v[i].score[cond].second=i+1; previous=v[i].score[cond].first; nowRank=i+1; } else v[i].score[cond].second=nowRank; } } bool compareAver(const info &lhs,const info& rhs){ return lhs.score[0].first>rhs.score[0].first; } bool compareClang(const info &lhs,const info& rhs){ return lhs.score[1].first>rhs.score[1].first; } bool compareMath(const info &lhs,const info& rhs){ return lhs.score[2].first>rhs.score[2].first; } bool compareEnglish(const info &lhs,const info& rhs){ return lhs.score[3].first>rhs.score[3].first; } void print(vector<info> &v,vector<string> s){ char table[5]={'A','C','M','E'}; int ranking=0,index=-1; for(auto it : s){ bool flag=false; for(auto k : v){ if(it==k.name){ flag=true; ranking=2147483647; for(int i=0;i<4;i++) if(k.score[i].second<ranking){ ranking=k.score[i].second; index=i; } } } if(flag) cout<<ranking<<" "<<table[index]<<endl; else cout<<"N/A"<<endl; } } int main(int agrc,char **argv){ //freopen("num.txt","r",stdin); cin>>N>>M; vector<info> ranks; vector<string> check; string name; pair<int,int> p[4]; for(int i=0;i<N;i++){ cin>>name>>p[1].first>>p[2].first>>p[3].first; p[0].first=(p[1].first+p[2].first+p[3].first)/3; ranks.push_back(info(name,p)); } for(int i=0;i<M;++i){ cin>>name; check.push_back(name); } std::sort(ranks.begin(),ranks.end(),compareAver); setRank(ranks,0); std::sort(ranks.begin(),ranks.end(),compareClang); setRank(ranks,1); std::sort(ranks.begin(),ranks.end(),compareMath); setRank(ranks,2); std::sort(ranks.begin(),ranks.end(),compareEnglish); setRank(ranks,3); print(ranks,check); return 0; }