PAT1012

传送门

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

/*    *********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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值