1012. The Best Rank (25)解答和解析

题目地址:https://www.patest.cn/contests/pat-a-practise/1012

解题思路:按照题目意思解题就可以


#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

#define MIN 2000
struct point{
	int id;
	int M;
	int C;
	int A;
	int E;
	int order;
	string order_atr;
	point(): M(0), C(0), A(0), E(0), order(MIN) {}
};

struct r{
	int order;
	string colour;
};

vector<r> ans;
vector<point> student;

int rank_A(int index)
{
	int order = 1;
	for(int i = 0; i < student.size(); i++)
	{
		if(i == index)
			continue;
		if(student[index].order <= order)
			break;
		if(student[index].A < student[i].A)
		{
			order++;
		}
	}
	if(student[index].order > order)
	{
		student[index].order = order;
		student[index].order_atr = "A";
	}
}

int rank_C(int index)
{
	int order = 1;
	for(int i = 0; i < student.size(); i++)
	{
		if(i == index)
			continue;
		if(student[index].order <= order)
			break;
		if(student[index].C < student[i].C)
		{
			order++;
		}
	}
	if(student[index].order > order)
	{
		student[index].order = order;
		student[index].order_atr = "C";
	}
}
int rank_M(int index)
{
	int order = 1;
	for(int i = 0; i < student.size(); i++)
	{
		if(i == index)
			continue;
		if(student[index].order <= order)
			break;
		if(student[index].M < student[i].M)
		{
			order++;
		}
	}
	if(student[index].order > order)
	{
		student[index].order = order;
		student[index].order_atr = "M";
	}
}

int rank_E(int index)
{
	int order = 1;
	for(int i = 0; i < student.size(); i++)
	{
		if(i == index)
			continue;
		if(student[index].order <= order)
			break;
		if(student[index].E < student[i].E)
		{
			order++;
		}
	}
	if(student[index].order > order)
	{
		student[index].order = order;
		student[index].order_atr = "E";
	}
}

int find_student(int id)
{
	for(int i = 0; i < student.size(); i++)
	{
		if(student[i].id == id)
			return i;
	}

	return -1;
}

int main(void)
{
	string line;
	while(getline(cin, line))
	{
		int m_n, n_n;
		ans.clear();
		student.clear();
		stringstream ss(line);
		ss >> n_n;
		ss >> m_n;
		//cout << n_n << m_n << endl;
		for(int i = 0; i < n_n; i++)
		{
			point temp;
			getline(cin, line);
			stringstream sss(line);
			sss >> temp.id;
			sss >> temp.C;
			sss >> temp.M;
			sss >> temp.E;
			temp.A = (temp.C + temp.M + temp.E) / 3;
			student.push_back(temp);
		}

		for(int i = 0; i < m_n; i++)
		{
			int id, index;
			getline(cin, line);
			stringstream ssss(line);
			ssss >> id;
			index = find_student(id);
			if(index == -1)
			{
				r temp;
				temp.order = -1;
				temp.colour = "N/A";
				ans.push_back(temp);
			}
			else
			{
				rank_A(index);
				rank_C(index);
				rank_M(index);
				rank_E(index);
				r temp;
				temp.order = student[index].order;
				temp.colour = student[index].order_atr;
				ans.push_back(temp);
			}

		}

		/*output*/
		for(int i = 0; i < ans.size(); i++)
		{
			if(ans[i].colour == "N/A")
				cout << "N/A" << endl;
			else
				cout << ans[i].order << " " << ans[i].colour << endl;
		}	
		//cout << endl;
		//cout << "input" << endl;
	}

	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值