爆刷PAT(甲级)——之【1012】 The Best Rank (25)

题意:每个同学三门科目,以及自己算出他们的平均分。求出每个同学的最好排名的科目并输出。

难点:没有难点。直接无脑选择排序都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;
}

猜你喜欢

转载自blog.csdn.net/Hide_in_Code/article/details/81635020