刷题:ranking排名问题

本文详细解析了一种用于处理多个考场内考生成绩排序的算法,包括结构体设计、排序策略和排名计算。通过实例演示了如何读取考生信息,利用自定义比较函数进行排序,并输出考生的总排名和考场内排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法学习第八篇

有n个考点,每个考点里面都有考生进行考试,如果现在分别给定每个考场的人数及该考场里面的考生编号和成绩,现在要求将所有考生按分数从高到底进行排序,并按顺序输出所有考生编号、排名(分数相同则按编号大小排序)、考场号、以及考场内部的排名。

分析:1.必然需要考虑先构造结构体,然后依次读入学生信息,再考虑对结构体的排序问题。2.编写cmp函数,使排序满足题目的要求。3.计算总排名,并且输出考生信息。

输入:
2
3
153821001 95
153821005 100
153821010 95
2
153821002 90
153821004 100
输出:
5
153821004 1 2 1  //编号,排名,考场号,考场排名
153821005 1 1 1
153821001 3 1 2
153821010 3 1 2
153821002 5 2 2

代码如下:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

struct stu
{
    char id[20];
    int score;
    int local_id;
    int local_rank;
    int sum_rank;
};
stu S[30000];
bool cmp(stu a, stu b)
{
    if(a.score!=b.score) return a.score>b.score; //分数从高到低
    else
    return strcmp(a.id, b.id) < 0; //a<b返回负数、a=b返回0、a>b返回正数
}

int main()
{
    int n,k,l,st=0,sum=0;
    scanf("%d", &n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d", &k);
        sum += k;
        l=st;
        for (int j=0;j<k;j++)
        {
            scanf("%s %d",S[st].id,&S[st].score);  //输入信息
            S[st].local_id = i;
            st++;
        }
        sort(S+l,S+l+k,cmp);
        S[l].local_rank = 1;   //给定一号
        for (int m=l+1;m<l+k;m++)
            if (S[m].score==S[m-1].score)
                S[m].local_rank=S[m-1].local_rank;
            else
                S[m].local_rank=m-l+1;
    }
    sort(S,S+st,cmp);
    printf("%d\n", sum);
    printf("%s %d %d %d\n",S[0].id,1,S[0].local_id,1);
    S[0].sum_rank = 1;
    for (int i=1;i<sum;i++)
        if (S[i].score==S[i-1].score) //如果与前面分数相同
        {
            S[i].sum_rank=S[i-1].sum_rank;
            printf("%s %d %d %d\n",S[i].id,S[i].sum_rank,S[i].local_id,S[i].local_rank);
        }
        else
        {
            S[i].sum_rank=i+1;
            printf("%s %d %d %d\n",S[i].id,S[i].sum_rank,S[i].local_id,S[i].local_rank);
        }
    system("pause");
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值