题意:每个同学三门科目,以及自己算出他们的平均分。求出每个同学的最好排名的科目并输出。
难点:没有难点。直接无脑选择排序都OK,数组开大点,不止1000个同学,开10000就OK了
Code:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 10009
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)
struct Info
{
string name;//姓名
double score[4];//各科目分数
int rank[4];//各科目排名
int best;//最好的科目
void set(int a,int b,int c)
{
score[0]=(a+b+c)/3;
score[1]=(double)a;
score[2]=(double)b;
score[3]=(double)c;
}
}st[inf];
int n,m;
void Solve();
void Input()
{
cin>>n>>m;
int i,j;
loop(i,0,n)
{
cin>>st[i].name;
int a,b,c;
cin>>a>>b>>c;
st[i].set(a,b,c);
}
Solve();//求出各科信息
string s;
loop(i,0,m)
{
cin>>s;
loop(j,0,n)
if(st[j].name==s)
{
int best=st[j].best;
cout<<st[j].rank[best]+1<<' ';//因为best是前面有几个人比他大,排名要+1
switch(best)
{
case 0:
cout<<'A'<<endl;break;
case 1:
cout<<'C'<<endl;break;
case 2:
cout<<'M'<<endl;break;
case 3:
cout<<'E'<<endl;break;
}
break;
}
if(j==n)
cout<<"N/A"<<endl;
}
}
void Solve()//求各值
{
int i,j,k;
loop(i,0,n)//每个人
{
loop(j,0,4)//每门科目
{
int sum=0;
loop(k,0,n)//其他人
if(st[k].score[j]>st[i].score[j])sum++;//此人比我分数高
st[i].rank[j]=sum;//此人这门课的排名
}
int best=0;
loop(j,0,4)
if(st[i].rank[j]<st[i].rank[best])best=j;//找自己最高排名科目
st[i].best=best;
}
}
int main()
{
Input();
return 0;
}