ZJU PAT 1012 The Best Rank

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;

#define Min(a,b)(a<b?a:b)

int n,m;
struct student
{
	int id,ctest,math,english;
	double avg;
	int crank,mrank,erank,arank;
	int bestrank;
	string bsetrankname;
};
student TT[2005];

bool cmpa(student a,student b)
{
	return a.avg>b.avg;
}

bool cmpc(student a,student b)
{
	return a.ctest>b.ctest;
}

bool cmpm(student a,student b)
{
	return a.math>b.math;
}

bool cmpe(student a,student b)
{
	return a.english>b.english;
}

void MakeaRank()
{
	for(int i=0;i<n;i++)
	{
		if(i==0) 
		{
			TT[i].arank=1;
			continue;
		}
		
		if(TT[i].avg!=TT[i-1].avg)
		{
			TT[i].arank=i+1;
		}
		else
		{
			TT[i].arank=TT[i-1].arank;
		}
	}
}

void MakecRank()
{
	for(int i=0;i<n;i++)
	{
		if(i==0) 
		{
			TT[i].crank=1;
			continue;
		}
		
		if(TT[i].ctest!=TT[i-1].ctest)
		{
			TT[i].crank=i+1;
		}
		else
		{
			TT[i].crank=TT[i-1].crank;
		}
	}
}

void MakemRank()
{
	for(int i=0;i<n;i++)
	{
		if(i==0) 
		{
			TT[i].mrank=1;
			continue;
		}
		
		if(TT[i].math!=TT[i-1].math)
		{
			TT[i].mrank=i+1;
		}
		else
		{
			TT[i].mrank=TT[i-1].mrank;
		}
	}
}

void MakeeRank()
{
	for(int i=0;i<n;i++)
	{
		if(i==0) 
		{
			TT[i].erank=1;
			continue;
		}
		
		if(TT[i].english!=TT[i-1].english)
		{
			TT[i].erank=i+1;
		}
		else
		{
			TT[i].erank=TT[i-1].erank;
		}
	}
}

void MakeBest()
{
	for(int i=0;i<n;i++)
	{
		int tmp=TT[i].arank;
		string ss="A";
		
		if(TT[i].crank<tmp)
		{
			tmp=TT[i].crank;
			ss="C";
		}
		if(TT[i].mrank<tmp)
		{
			tmp=TT[i].mrank;
			ss="M";
		}
		if(TT[i].erank<tmp)
		{
			tmp=TT[i].erank;
			ss="E";
		}
		TT[i].bestrank=tmp;
		TT[i].bsetrankname=ss;
	}
}

void run()
{
	int i,j;
	
	for(i=0;i<n;i++) 
	{
		scanf("%d%d%d%d",&TT[i].id,&TT[i].ctest,&TT[i].math,&TT[i].english);
		TT[i].avg=(TT[i].ctest+TT[i].math+TT[i].english)*1.0/3.0;
	}

	//----cmp by avg-----------
	sort(TT,TT+n,cmpa);
	MakeaRank();
	
	//----cmp by ctest-----------
	sort(TT,TT+n,cmpc);
	MakecRank();
	
	
	//----cmp by math------------
	sort(TT,TT+n,cmpm);
	MakemRank();
	
	//----cmp by english------------
	sort(TT,TT+n,cmpe);
	MakeeRank();
	
	//----cmp by math------------
	sort(TT,TT+n,cmpa);
	MakeaRank();
	
	MakeBest();
	
	
	int curid;
	for(i=0;i<m;i++)
	{
		scanf("%d",&curid);
		for(j=0;j<n;j++)
		{
			if(TT[j].id==curid)
			{
				printf("%d %s\n",TT[j].bestrank,TT[j].bsetrankname.c_str());
				break;
			}
		}
		if(j==n)
			printf("N/A\n");
	}
}

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF) run();
	return 0;
}

给出学生3门课的成绩,求每名学生在3门课以及平均分中所能取得的最高排名。

注意:并列排名的处理上:应该是1 2 3 3 5,而不是1 2 3 3 4


你可能感兴趣的:(ACM,pat,ZJU)