PAT Advanced 1012

这道题我是一次过的,but。。。。。_(:зゝ∠)_

我用了180行,算是我写代码用的最图省事的一个代码,我原本以为只有我那么写,网上收了下博客,发现竟然有同道中人,当时眼泪就掉下来了。现在这段代码风格特别不好,先在这里保存着,待我有空就来优化一下这段代码。

关于题目:

没什么好说的,就是水水的模拟而已啦~

#include<iostream>
#include<fstream>
#include<algorithm>
#include<map>
using namespace std;
//ifstream fin("fin.txt");
//streambuf *old = cin.rdbuf(fin.rdbuf());
//离散化
struct node
{
	int C, M, E, A;
	int rankC, rankM, rankE, rankA;
	char B;
	bool flag;
	int id;
	int maxrank;
};
int discrete[1000000];
node student[1000000];
int Rank[1000000];
int N, M;
bool cmpC(node a, node b)
{
	return a.C > b.C;
}
bool cmpM(node a, node b)
{
	return a.M > b.M;
}
bool cmpE(node a, node b)
{
	return a.E > b.E;
}
bool cmpA(node a, node b)
{
	return a.A > b.A;
}
int MAX(int x, int y)
{
	return x<y ? x : y;
}
void solve()
{
	int id;
	for (int i = 1; i <= M; i++)
	{
		cin >> id;
		if (!discrete[id])
		{
			cout << "N/A" << endl;
			continue;
		}
		for (int i = 1; i <= N; i++)
		{
			if (student[i].id == id)
			{
				cout << student[i].maxrank << " " << student[i].B << endl;
			}
		}
	}
}
void input()
{
	cin >> N >> M;
	int id, C, M, E;
	for (int i = 1; i <= N; i++)
	{
		cin >> id >> C >> M >> E;
		discrete[id] = i;
		student[i].id= id;
		student[i].C = C;
		student[i].M = M;
		student[i].E = E;
		student[i].A = (C + M + E) / 3;
	}
	sort(student + 1, student + 1 + N, cmpC);
	int flag = 1;
	for (int i = 1; i <= N; i++)
	{
		if (i == 1)
			student[i].rankC = 1;
		else
		{
			if (student[i].C == student[i - 1].C)
			{
				student[i].rankC = student[i - 1].rankC;
				flag++;
			}
			else
			{
				student[i].rankC = student[i - 1].rankC + flag;
				flag = 1;
			}
		}
	}
	sort(student + 1, student + 1 + N, cmpM);
	flag = 1;
	for (int i = 1; i <= N; i++)
	{
		if (i == 1)
			student[i].rankM = 1;
		else
		{
			if (student[i].M == student[i - 1].M)
			{
				student[i].rankM = student[i - 1].rankM;
				flag++;
			}
			else
			{
				student[i].rankM = student[i - 1].rankM + flag;
				flag = 1;
			}
		}
	}
	sort(student + 1, student + 1 + N, cmpE);
	flag = 1;
	for (int i = 1; i <= N; i++)
	{
		if (i == 1)
			student[i].rankE = 1;
		else
		{
			if (student[i].E == student[i - 1].E)
			{
				student[i].rankE = student[i - 1].rankE;
				flag++;
			}
			else
			{
				student[i].rankE = student[i - 1].rankE + flag;
				flag = 1;
			}
		}
	}
	sort(student + 1, student + 1 + N, cmpA);
	flag = 1;
	for (int i = 1; i <= N; i++)
	{
		if (i == 1)
			student[i].rankA = 1;
		else
		{
			if (student[i].A == student[i - 1].A)
			{
				student[i].rankA = student[i - 1].rankA;
				flag++;
			}
			else
			{
				student[i].rankA = student[i - 1].rankA + flag;
				flag = 1;
			}
		}
	}
	int t = 0;
	for (int i = 1; i <= N; i++)
	{
		student[i].maxrank = MAX(MAX(student[i].rankA, student[i].rankC), MAX(student[i].rankE, student[i].rankM));
		node te = student[i];
		if (te.rankA == te.maxrank)
		{
			student[i].B = 'A';
		}
		else if (te.rankC == te.maxrank)
		{
			student[i].B = 'C';
		}
		else if (te.rankM == te.maxrank)
		{
			student[i].B = 'M';
		}	
		else if (te.rankE == te.maxrank)
		{
			student[i].B = 'E';
		}
	}
	solve();
}
int main()
{
	input();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值