pat甲级1012(并列排序)

题目链接:传送门

思路:排序时要考虑并列的情况,如果有相同的成绩都是并列第i,

但是注意:

要满足:1 1 3 4 5

而不是:1 1 2 3 4

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 200200;
struct Node{
	int id,cs,ms,es,as;
	int cth,mth,eth,ath;
	int fth;
	char ff;
}cur[maxn];
map <int,int> mp;
bool cmp(Node a,Node b)
{
	return a.cs>b.cs;
}
bool mmp(Node a,Node b)
{
	return a.ms>b.ms;
}
bool emp(Node a,Node b)
{
	return a.es>b.es;
}
bool amp(Node a,Node b)
{
	return a.as>b.as;
}
int main(void)
{
	int n,m,x,i;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++) 
	scanf("%d%d%d%d",&cur[i].id,&cur[i].cs,&cur[i].ms,&cur[i].es),cur[i].as=(cur[i].cs+cur[i].es+cur[i].ms)/3;
	sort(cur,cur+n,cmp);
	cur[0].cth=1;
	for(i=1;i<n;i++)
	if(cur[i].cs==cur[i-1].cs) cur[i].cth=cur[i-1].cth;
	else cur[i].cth=i+1;
	
	sort(cur,cur+n,mmp);
	cur[0].mth=1;
	for(i=1;i<n;i++)
	if(cur[i].ms==cur[i-1].ms) cur[i].mth=cur[i-1].mth;
	else cur[i].mth=i+1;
	
	sort(cur,cur+n,emp);
	cur[0].eth=1;
	for(i=1;i<n;i++)
	if(cur[i].es==cur[i-1].es) cur[i].eth=cur[i-1].eth;
	else cur[i].eth=i+1;
	
	sort(cur,cur+n,amp);
	cur[0].ath=1;
	for(i=1;i<n;i++)
	if(cur[i].as==cur[i-1].as) cur[i].ath=cur[i-1].ath;
	else cur[i].ath=i+1;
	
	for(i=0;i<n;i++){
		int tt=min(min(cur[i].ath,cur[i].cth),min(cur[i].eth,cur[i].mth));
		if(cur[i].ath==tt){
			cur[i].fth=cur[i].ath;
			cur[i].ff='A';
		}
		else if(tt==cur[i].cth){
			cur[i].fth=cur[i].cth;
			cur[i].ff='C';
		}
		else if(tt==cur[i].mth){
			cur[i].fth=cur[i].mth;
			cur[i].ff='M';
		}
		else if(tt==cur[i].eth){
			cur[i].fth=cur[i].eth;
			cur[i].ff='E';
		}
		
		mp[cur[i].id]=i+1;
	}
	for(i=0;i<m;i++){
		scanf("%d",&x);
		x=mp[x];
		if(x>0){
			x--;
			printf("%d %c\n",cur[x].fth,cur[x].ff);
		}
		else{
			printf("N/A\n");
		}
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值