PAT甲级1012结构体排序(有坑)

题目链接:传送门

这题太坑了,坑的我不想说话
真的有点想吐槽,感觉PAT的题目就细节描述地模糊,就让人去猜,猜得我特别恼火,不明白为什么不能说清楚呢。
这道题的问题在于,他没有说清楚排序,在分数相同的时候,排名应该是12335还是12334。
最后我看了人家的博客,因为一直有一个测试点过不了,以下是博客链接:我在这里呀!

写的有点生气真的是

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<iostream>
#include<map>
#include<set>
#include<queue>
#include<stack>
#define inf 4000000000000000000
using namespace std;
typedef long long ll;
const ll maxn=1e6+50;
const ll mod=1e9+7;
const double eps=1e-9;

struct node
{
	string id;
	ll a,c,m,e,ranka,rankc,rankm,ranke;
}a[2050],b[2050],c[2050],d[2050];

bool cmp_c(node a,node b)
{
	return a.c>b.c;
}

bool cmp_m(node a,node b)
{
	return a.m>b.m;
}

bool cmp_e(node a,node b)
{
	return a.e>b.e;
}

bool cmp_a(node a,node b)
{
	return a.a>b.a;
}

int main()
{
	ll n,m;
	scanf("%lld %lld",&n,&m);
	for(ll i=1;i<=n;i++)
	{
		cin>>a[i].id>>a[i].c>>a[i].m>>a[i].e;
		a[i].a=a[i].c+a[i].m+a[i].e;
	}
	sort(a+1,a+1+n,cmp_a);
	a[1].ranka=1;
	for(ll i=2;i<=n;i++)
	{
		if(a[i].a==a[i-1].a)a[i].ranka=a[i-1].ranka;
		else a[i].ranka=i;
	}
	sort(a+1,a+1+n,cmp_c);
	a[1].rankc=1;
	for(ll i=2;i<=n;i++)
	{
		if(a[i].c==a[i-1].c)a[i].rankc=a[i-1].rankc;
		else a[i].rankc=i;
	}
	sort(a+1,a+1+n,cmp_m);
	a[1].rankm=1;
	for(ll i=2;i<=n;i++)
	{
		if(a[i].m==a[i-1].m)a[i].rankm=a[i-1].rankm;
		else a[i].rankm=i;
	}
	sort(a+1,a+1+n,cmp_e);
	a[1].ranke=1;
	for(ll i=2;i<=n;i++)
	{
		if(a[i].e==a[i-1].e)a[i].ranke=a[i-1].ranke;
		else a[i].ranke=i;
	}
	
	for(ll i=1;i<=m;i++)
	{
		string x;
		cin>>x;
		bool flag=0;
		for(ll j=1;j<=n;j++)
		{
			if(a[j].id==x)
			{
				flag=1;
				if(a[j].ranka<=a[j].rankc&&a[j].ranka<=a[j].rankm&&a[j].ranka<=a[j].ranke)printf("%lld A\n",a[j].ranka);
				else if(a[j].rankc<=a[j].ranka&&a[j].rankc<=a[j].rankm&&a[j].rankc<=a[j].ranke)printf("%lld C\n",a[j].rankc);
				else if(a[j].rankm<=a[j].rankc&&a[j].rankm<=a[j].ranka&&a[j].rankm<=a[j].ranke)printf("%lld M\n",a[j].rankm);
				else if(a[j].ranke<=a[j].rankc&&a[j].ranke<=a[j].rankm&&a[j].ranke<=a[j].ranka)printf("%lld E\n",a[j].ranke);
				break;	
			}
		}
		if(!flag)printf("N/A\n");
	}
	//scanf("%lld",&n);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值