爆刷PAT(甲级)——之【1012】 The Best Rank (25)——C++排序练习

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值