1012. The Best Rank (25)

点击打开链接

最大的坑点就是rank的排名中:对于相同分数,相同排名

#include <cstdio>
#include <algorithm>
using namespace std;
int n,m;
struct de{
	int id;
	int c;
	int m;
	int e;
	int a;
	int cr;
	int mr;
	int er;
	int ar;
}stu[2010];
bool cmp_c(de a,de b){
	return a.c>b.c;
};
bool cmp_m(de a,de b){
	return a.m>b.m;
};
bool cmp_e(de a,de b){
	return a.e>b.e;
};
bool cmp_a(de a,de b){
	return a.a>b.a;
};
int find(int x){
	for(int i=0;i<n;i++){
		if(stu[i].id==x){
			return i;
		}
	}
	return -1;
}
struct ran{
	char s;
	int r;
	int pro;
}tmp[4];
bool cmprank(ran a,ran b){
	if(a.r!=b.r){
		return a.r<b.r;
	}else{
		return a.pro<b.pro;
	}
	
}
int main(){
	freopen("in.txt","r",stdin);
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%d %d %d %d",&stu[i].id,&stu[i].c,&stu[i].m,&stu[i].e);
		stu[i].a=(stu[i].c+stu[i].m+stu[i].e)/3;
	}
	//同排名算排第几?
	sort(stu,stu+n,cmp_c);
	for(int i=0;i<n;i++){
		if(i==0){
			stu[i].cr=1;
		}else{
			if(stu[i].c!=stu[i-1].c){
				stu[i].cr=i+1;
			}else{
				stu[i].cr=stu[i-1].cr;
			}
		}
		
	}
	sort(stu,stu+n,cmp_a);
	for(int i=0;i<n;i++){
		if(i==0){
			stu[i].ar=1;
		}else{
			if(stu[i].a!=stu[i-1].a){
				stu[i].ar=i+1;
			}else{
				stu[i].ar=stu[i-1].ar;
			}
		}
	}
	sort(stu,stu+n,cmp_m);
	for(int i=0;i<n;i++){
		if(i==0){
			stu[i].mr=1;
		}else{
			if(stu[i].m!=stu[i-1].m){
				stu[i].mr=i+1;
			}else{
				stu[i].mr=stu[i-1].mr;
			}
		}
	}
	sort(stu,stu+n,cmp_e);
	for(int i=0;i<n;i++){
		if(i==0){
			stu[i].er=1;
		}else{
			if(stu[i].e!=stu[i-1].e){
				stu[i].er=i+1;
			}else{
				stu[i].er=stu[i-1].er;
			}
		}
	}
	for(int i=0;i<m;i++){
		int x;
		scanf("%d",&x);
		int res=find(x);
		if(res==-1){
			printf("N/A\n");
		}else{
			tmp[0].s='C';
			tmp[0].pro=2;
			tmp[0].r=stu[res].cr;
			tmp[1].s='M';
			tmp[1].pro=3;
			tmp[1].r=stu[res].mr;
			tmp[2].s='E';
			tmp[2].pro=4;
			tmp[2].r=stu[res].er;
			tmp[3].s='A';
			tmp[3].pro=1;
			tmp[3].r=stu[res].ar;
			sort(tmp,tmp+4,cmprank);
			printf("%d %c\n",tmp[0].r,tmp[0].s);
		}
	}
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值