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;
}
这是一道结构体排序问题,只不过排序的条件有点特别,但是我们可以传一个谓词给函数。还有一个坑就是注意俩人排名相同的情况,比如有两人并列第一,实际上分数第二的人排名就是第三了。
/* *********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;
}
相关文章推荐
- 怎样使用nat和桥接方式解决虚拟机联网问题
- 参数文件损坏或丢失
- SSH login to Aliyun ubuntu server without password
- cream 的qsqrt 及其原理
- 【.NET深呼吸】基础:自定义类型转换
- 使用FiddlerCore来测试WebAPI
- 简单的文本加密
- SQL * Loader详解
- mac+virtualbox+ubuntu 共享文件夹
- 服务器接受客户端图片
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- Android开源项目:捕鱼达人游戏源代码
- linux Cent OS6.5 安装nodeJS(分分钟搞定)
- 如何安全退出已调用多个Activity的Application?
- unity C#模板
- hdu 2045 不容易系列之(3)—— LELE的RPG难题
- Hadoop伪分布集群安装
- HDU5595
- POJ 2262 筛素法
- ARRAYLIST VECTOR LINKEDLIST 区别与用法