PAT (Advanced) 1012. The Best Rank (25)

原题:1012. The Best Rank (25)




解题思路:

1.按照题意对每种成绩进行排序, 然后进行排名即可

2.排名时注意,成绩相同者排名相同,而成绩相同者向后第一位不同者,排名应该为前面的人数总和加一,如:99 98 98 98 97 ,第一个人为第一, 第二、三、四个人并列第二, 第五个人为第五。


C++代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2010;
struct Student
{
    int id;
    int score[4]; //四个成绩分别为 A C M E
    int Rank[4]; //四个排名分别为A C M E
} stu[maxn];
//打表
char table[4] = {'A', 'C', 'M', 'E'};

//比较函数,可根据不同情况比较不同的成绩
int now;
bool cmp(Student a, Student b)
{
    return a.score[now] > b.score[now];
}

//排名函数,对第i个成绩进行拍名,总人数为n
void RankFunc(int i, int n)
{
    int r = 1;
    stu[0].Rank[i] = r;
    for(int j = 1; j < n; j++)
    {
        if(stu[j].score[i] == stu[j-1].score[i])
            stu[j].Rank[i] = r;
        else
        {
            r = j + 1;
            stu[j].Rank[i] = r;
        }
    }
}
int main()
{
    int n, m;
    while(scanf("%d%d", &n, &m) != EOF)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d%d%d", &stu[i].id, &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
            stu[i].score[0] = 0;
            for(int j = 1; j < 4; j++)
                stu[i].score[0] += stu[i].score[j];
        }
        
        //对四个成绩分解进行排名
        for(int i = 0; i < 4; i++)
        {
            now = i;
            sort(stu, stu + n, cmp);
            RankFunc(i, n);
        }

        //输出
        for(int i = 0; i < m; i++)
        {
            int id ;
            scanf("%d", &id);
            int flag = 0;
            for(int j = 0; j < n; j++)
            {
                if(id == stu[j].id)
                {
                    flag = 1;
                    int course = 0, minR = 10000;
                    //寻找最高名次
                    for(int k = 0; k < 4; k++)
                    {
                        if(stu[j].Rank[k] < minR)
                        {
                            course = k;
                            minR = stu[j].Rank[k];
                        }
                    }
                    printf("%d %c\n", minR, table[course]);
                    break;
                }
            }
            //无效id
            if(flag == 0)
                printf("N/A\n");
        }


    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值