pat 1012 The Best Rank

注意有並列的時候的名次,比如兩個第一名則爲1,1,3而不是1,1,2

改代碼後續優化:1,按照學號查找的時候可以採用二分查找。2,代碼冗餘部分可以精簡

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

struct Student
{
	//char *id;
	string id;
	int C;
	int M;
	int E;
	int A;
	int C_no;
	int M_no;
	int E_no;
	int A_no;
};

vector<Student> vec;

bool sort_A(Student s1,Student s2)
{
	return s1.A>s2.A;
}
bool sort_C(Student s1,Student s2)
{
	return s1.C>s2.C;
}
bool sort_M(Student s1,Student s2)
{
	return s1.M>s2.M;
}
bool sort_E(Student s1,Student s2)
{
	return s1.E>s2.E;
}

void print(string id,int n)
{
	int bestRank=5000;
	string best="N/A";
	for(int i=0;i<n;i++)
	{
		if(vec[i].id==id)
		{
			if(vec[i].A_no<bestRank)
			{
				bestRank=vec[i].A_no;
				best="A";
			}
			if(vec[i].C_no<bestRank)
			{
				bestRank=vec[i].C_no;
				best="C";
			}
			if(vec[i].M_no<bestRank)
			{
				bestRank=vec[i].M_no;
				best="M";
			}
			if(vec[i].E_no<bestRank)
			{
				bestRank=vec[i].E_no;
				best="E";
			}
		}
	}
	if(bestRank<5000)
		cout<<bestRank<<" ";
	cout<<best<<endl;
	return;
}

int main()
{
	freopen("F:/CppProject/data/1012.txt","r",stdin);
	int n,m;
	scanf("%d%d",&n,&m);
	
	int C,M,E,A;
	for(int i=0;i<n;i++)
	{
		string sid;
		cin>>sid>>C>>M>>E;
		A=(C+M+E)/3;
		Student s={sid,C,M,E,A,0,0,0,0};
		vec.push_back(s);
		//cout<<s.id<<endl;
	}
	
	sort(vec.begin(),vec.end(),sort_A);
	int rank=2;
	vec[0].A_no=1;
	for(int i=1;i<n;i++)
	{
		if(vec[i].A==vec[i-1].A)
			vec[i].A_no=vec[i-1].A_no;
		else
			vec[i].A_no=rank;
		rank++;
	}

	sort(vec.begin(),vec.end(),sort_C);
	rank=2;
	vec[0].C_no=1;
	for(int i=1;i<n;i++)
	{
		if(vec[i].C==vec[i-1].C)
			vec[i].C_no=vec[i-1].C_no;
		else
			vec[i].C_no=rank;
		rank++;
	}

	sort(vec.begin(),vec.end(),sort_M);
	rank=2;
	vec[0].M_no=1;
	for(int i=1;i<n;i++)
	{
		if(vec[i].M==vec[i-1].M)
			vec[i].M_no=vec[i-1].M_no;
		else
			vec[i].M_no=rank;
		rank++;
	}

	sort(vec.begin(),vec.end(),sort_E);
	rank=2;
	vec[0].E_no=1;
	for(int i=1;i<n;i++)
	{
		if(vec[i].E==vec[i-1].E)
			vec[i].E_no=vec[i-1].E_no;
		else
			vec[i].E_no=rank;
		rank++;
	}

	for(int i=0;i<m;i++)
	{
		string query;
		cin>>query;
		print(query,n);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章