这道题我是一次过的,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;
}