1 条题解

  • 0
    @ 2025-9-26 23:19:04

    数据准备

    定义peo结构体存储学生的编号(num)和得分(sc)。
    用全局变量string s存储标准答案,pe数组存储所有学生的信息。

    得分计算逻辑(swe函数)程序将 49 道题分为 3 个区间,按不同规则计算得分:

    前 15 题(索引 0-14):每题 2 分,答案与标准答案一致则加 2 分。
    中间 24 题(索引 15-38):分为 4 组(每组 6 题),其中每组的第 1 题和第 6 题每题 2 分,其余 4 题每题 1.5 分,答案正确则加对应分值。
    最后 10 题(索引 39-48):每题 2 分,答案与标准答案一致则加 2 分。

    排序规则(comp函数)使用sort函数对学生数组排序,排序优先级为:

    先按得分降序排列(得分高的在前);
    若得分相同,按编号升序排列(编号小的在前)。

    主流程

    读取学生数量n和标准答案s。
    循环读取每个学生的答案,计算得分并存储到pe数组。
    对pe数组按规则排序后,依次输出每个学生的编号和得分。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // 定义学生结构体:存储编号和分数
    typedef struct peo {
        int num;    // 学生编号
        double sc;  // 学生分数
    } peo;
    
    char s[50];  // 存储标准答案(最多49个字符)
    
    // 计算学生得分的函数
    // 参数:学生答案字符串p
    // 返回:该学生的总得分
    double swe(const char* p) {
        double sum = 0.0;
        // 遍历49道题目(索引0-48)
        for (int i = 0; i < 49; i++) {
            // 前15题:每题2分
            if (i < 15) {
                if (s[i] == p[i]) {
                    sum += 2.0;
                }
            }
            // 第16-39题(共24题,4组,每组6题)
            else if (i < 39) {
                // 每组中,除第1和第6题(索引0和5)外,其余4题每题1.5分
                if ((i - 14) % 6 != 5 && (i - 14) % 6 != 0) {
                    if (s[i] == p[i]) {
                        sum += 1.5;
                    }
                }
                // 每组中第1和第6题:每题2分
                else {
                    if (s[i] == p[i]) {
                        sum += 2.0;
                    }
                }
            }
            // 第40-49题(共10题):每题2分
            else {
                if (s[i] == p[i]) {
                    sum += 2.0;
                }
            }
        }
        return sum;
    }
    
    // qsort排序的比较函数
    // 规则:分数高的在前;分数相同则编号小的在前
    int compare(const void* a, const void* b) {
        peo* p1 = (peo*)a;
        peo* p2 = (peo*)b;
        // 分数不同时,降序排列
        if (p1->sc != p2->sc) {
            return (p2->sc > p1->sc) ? 1 : -1;
        }
        // 分数相同时,编号升序排列
        else {
            return (p1->num < p2->num) ? -1 : 1;
        }
    }
    
    peo pe[100];  // 存储最多100个学生的信息
    
    int main() {
        char p[50];  // 存储单个学生的答案
        int n;       // 学生数量
    
        // 读取学生数量
        scanf("%d", &n);
        // 读取标准答案
        scanf("%s", s);
    
        // 读取每个学生的答案并计算得分
        for (int i = 0; i < n; i++) {
            scanf("%s", p);
            pe[i].num = i + 1;  // 编号从1开始
            pe[i].sc = swe(p);  // 计算得分
        }
    
        // 对学生按规则排序
        qsort(pe, n, sizeof(peo), compare);
    
        // 输出排序结果(分数保留1位小数)
        for (int i = 0; i < n; i++) {
            printf("%d %.1f\n", pe[i].num, pe[i].sc);
        }
    
        return 0;
    }
        
    
    
    • 1

    信息

    ID
    620
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    24
    已通过
    4
    上传者