您的位置:首页 > 其它

PAT1012

2015-12-13 12:42 281 查看
传送门

这是一道结构体排序问题,只不过排序的条件有点特别,但是我们可以传一个谓词给函数。还有一个坑就是注意俩人排名相同的情况,比如有两人并列第一,实际上分数第二的人排名就是第三了。

/* *********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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: