PAT甲级-1075 Judge

server/2024/9/22 21:48:47/

题目

 

题目大意

对参加PAT考试的考生进行排名。输入给出人数N,题目数量K,提交总次数M。接下来一行给出每道题对应的分数。考生的提交按照 考生id-题目序号-本次提交的分数 格式给出。

注意,如果提交的结果编译器未通过,那么给定的分数会是-1,但是该考生该题所得的分数为0。

排序按照 总分数>得满分的题目总数>id 的优先级。如果一个考生没有可以通过编译器的提交或者没有任何提交,那么这个考生不参与排名。参与排名的考生,没有提交过的题目输出“-”, 提交但编译不通过的就输出0,提交并通过的就输出相应的分数。

思路

首先想到的就是用结构体将id,各题分数,排名,总分,得满分的题目数量捆绑在一起。各题分数可以用一个int数组,因为N、M的范围都比较大,而K的范围<=5,所以不会占用太多内存空间。

我觉得题目最关键的就是对“0”、“-1”、“-”这几种情况的处理,用什么把这几种情况区分开来,反正用total是很难直接区分的。我把score[6]数组初始化为-1,如果某个用户没有任何提交或者提交的编译器不通过,那么从score[1]到score[5]的和一定是-5,这样就可以把不参与排名的人排除掉,而剩下的就是参与排名的人。之前说过题意,参与排名的人提交但不通过编译器,得分还是0,所以要加一个flag数组,看每个题是做过但没通过编译还是压根就没做过,再来个for循环遍历,将做过但没通过编译的题目分数从-1改成0。

这里我又在结构体中加了一个total2,total2是不管flag数组的,是为了排除不参与排名的人设置的,total2 = -5 时,就可以把这个人删了。total则是计算总分数的。total计算完后排序,再按照题意输出就ok了。

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;struct stu{int id;int score[6];  // 从1开始存储分数int flag[6];  // 每道题目有没有写int total;  // 题目中要求的总分数int total2;  // 如果是-5则不参与排序int num;  // 得满分的题目的数量int rank;
};
vector<stu> v(10003);bool cmp(stu x, stu y){if (x.total == y.total){if (x.num == y.num){return x.id < y.id;}return x.num > y.num;}return x.total > y.total;
}int main(){int n, k, m;cin >> n >> k >> m;vector<int> t(k + 1);  // 题目for (int i = 1; i <= k; i++){cin >> t[i];}for (int i = 1; i <= n; i++){for (int j = 1; j <= 6; j++){v[i].score[j] = -1;}}  // 初始化scorefor (int i = 0; i < m; i++){int id, tid, score;cin >> id >> tid >> score;v[id].id = id;v[id].score[tid] = max(score, v[id].score[tid]);v[id].flag[tid] = 1;}for (int i = 1; i <= n; i++){for (int j = 1; j < 6; j++){if (v[i].flag[j] == 1){v[i].total += v[i].score[j];}v[i].total2 += v[i].score[j];if (v[i].score[j] == t[j]){v[i].num++;}}if (v[i].total2 == -5){v.erase(v.begin() + i);i--;n--;}}  // 筛选出参与排序的人for (int i = 1; i <= n; i++){for (int j = 1; j <= k; j++){if (v[i].score[j] == -1 && v[i].flag[j] == 1){v[i].score[j] = 0;v[i].total++;}}}  // 只要参与排名,即使有一道题提交为-1,这个题分数也为0sort(v.begin() + 1, v.begin() + n + 1, cmp);v[1].rank = 1;for (int i = 1; i <= n; i++){if (i == 1){cout << "1" << " ";}else{v[i].total == v[i-1].total ? v[i].rank = v[i-1].rank : v[i].rank = i;cout << v[i].rank << " ";}printf("%05d %d ", v[i].id, v[i].total);for (int j = 1; j <= k; j++){if (v[i].flag[j] == 1){cout << v[i].score[j];}else{cout << "-";}if (j != k){cout << " ";}}cout << endl;}return 0;
}


http://www.ppmy.cn/server/119089.html

相关文章

【设计模式】工厂模式、单例模式、观察者模式、发布订阅模式

1.工厂模式 class Factory{createProduct(name){return new Product(name);} } class Product{constructor(name){this.namename;}display(){console.log(product:${this.name});} }//使用 const factorynew Factory(); const p1factory.createProduct(P1); const p2factory.c…

【笔记】扩散模型(八):DALL-E 2 (unCLIP) 论文解读与代码实现

论文链接&#xff1a;Hierarchical Text-Conditional Image Generation with CLIP Latents 非官方实现&#xff1a;lucidrains/DALLE2-pytorch DALL-E 2 是一个比较经典的文生图模型&#xff0c;虽然和 Stable Diffusion 的架构有些区别&#xff0c;但是也利用了 CLIP 的文本-图…

Selenium with Python学习笔记整理(网课+网站)

本篇是根据学习网站和网课结合自己做的学习笔记&#xff0c;后续会一边学习一边补齐和整理笔记 官方学习网站在这获取&#xff1a; https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

孙怡带你深度学习(1)--神经网络

文章目录 深度学习神经网络1. 感知器2. 多层感知器偏置 3. 神经网络的构造4. 模型训练损失函数 总结 深度学习 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向。 从上方的内容包含结果&#xff0c;我们可以知道&#xff0c;在学习深度学…

Redis 配置

一、关系型数据库与非关系型数据库 1. 关系型数据库 关系型数据库是一种结构化数据库&#xff0c;基于关系模型&#xff08;二维表格模型&#xff09;&#xff0c;适合记录数据。通过 SQL&#xff08;结构化查询语言&#xff09;进行数据的检索和操作。主流的关系型数据库包括…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字&#xff08;例如&#xff1a;改成“全选”&#xff09;&#xff0c;objectName是要改成程序员所熟悉的名字&#xff08;英文&#xff0c;符合代码规范&#xff09;方便修改和书写代码&#xff0c;一看就能看懂的 三、…

git rev-parse

git rev-parse 是 Git 中一个非常有用的命令&#xff0c;用于解析并返回与 Git 对象&#xff08;如提交、分支、标签等&#xff09;相关的信息。它可以帮助我们从给定的引用&#xff08;ref&#xff09;中解析出 SHA-1 哈希值、路径信息等。这个命令在编写 Git 脚本时尤其有用&…

深度剖析iOS渲染

iOS App 图形图像渲染的基本流程&#xff1a; 1.CPU&#xff1a;完成对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。 2.GPU&#xff1a;GPU拿到CPU计算好的显示内容&#xff0c;完成纹理的渲染&#xff0c; 渲染完成后将渲…