1 条题解
-
0
数据准备
定义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
- 上传者