A1012 The Best Rank (25 分| 排序,附详细注释,逻辑分析)

写在前面

  • 思路分析
    • 已知n个考生的3门分数,平均分可以按照这三门算出来。然后分别对这四个分数从高到低排序,每个考生有4个排名。
      • k个查询,对于每1个学⽣生id,输出当前id学生的最好排名和它对应分数,如果名次相同,按照A>C>M>E的顺序输出
      • 当前id不不存在,输出N/A
    • 实现分析:
      • 用结构体存储学生的id、四门成绩、四门排名、最好排名对应科目下标
      • 排名并列应该1、 1、 3、 4、 5,而不是1、 1、 2、 3、 4,否则会有1个测试点不过
      • 平均分四舍五入,按照+0.5后取整
      • 存储按照ACME的顺序存储简化程序逻辑
      • 用exist数组保存当前id是否存在,id对应的stu结构体下标
        • 用i+1可以保证为0的都是不存在的,直接输出N/A,
        • 其余不为0的,保存的值是对应的结构体index + 1的值
  • 细节处理耗费较多时间

测试用例

  • input:
    5 6
    310101 98 85 88
    310102 70 95 88
    310103 82 87 94
    310104 91 91 91
    310105 85 90 90
    310101
    310102
    310103
    310104
    310105
    999999
    output:
    1 C
    1 M
    1 E
    1 A
    3 A
    N/A
    

ac代码

  • #include <cstdio>
    #include <algorithm>
    using namespace std;
    struct node
    {
        int id, best;
        int score[4], rank[4];
    } stu[2005];
    int exist[1000000], flag = -1;
    bool cmp1(node a, node b)
    {
        return a.score[flag] > b.score[flag];
    }
    int main()
    {
        int n, m, id;
        scanf("%d %d", &n, &m);
        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] = (stu[i].score[1] + stu[i].score[2] + stu[i].score[3])
                              / 3.0 + 0.5;
        }
        for(flag = 0; flag <= 3; flag++)
        {
            sort(stu, stu + n, cmp1);
            stu[0].rank[flag] = 1;
            for(int i = 1; i < n; i++)
            {
                stu[i].rank[flag] = i + 1;
                if(stu[i].score[flag] == stu[i-1].score[flag])
                    stu[i].rank[flag] = stu[i-1].rank[flag];
            }
        }
    
        for(int i = 0; i < n; i++)
        {
            exist[stu[i].id] = i + 1;
            stu[i].best = 0;
            int minn = stu[i].rank[0];
            for(int j = 1; j <= 3; j++)
            {
                if(stu[i].rank[j] < minn)
                {
                    minn = stu[i].rank[j];
                    stu[i].best = j;
                }
            }
        }
    
        char c[5] = {'A', 'C', 'M', 'E'};
        for(int i = 0; i < m; i++)
        {
            scanf("%d", &id);
            int tmp = exist[id];
            if(tmp)
            {
                int best = stu[tmp-1].best;
                printf("%d %c\n", stu[tmp-1].rank[best], c[best]);
            }
            else
                printf("N/A\n");
        }
        return 0;
    }
    
发布了328 篇原创文章 · 获赞 107 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100620599
今日推荐