PTA(Advanced Level)1075.PAT Judge
The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT.
Input Specification:
Each input file contains one test case. For each case, the first line contains 3 positive integers, N (≤104), the total number of users, K (≤5), the total number of problems, and M (≤105), the total number of submissions. It is then assumed that the user id's are 5-digit numbers from 00001 to N, and the problem id's are from 1 to K. The next line contains K positive integers p[i] (i=1, ..., K), where p[i] corresponds to the full mark of the i-th problem. Then M lines follow, each gives the information of a submission in the following format:
user_id problem_id partial_score_obtained
where partial_score_obtained is either −1 if the submission cannot even pass the compiler, or is an integer in the range [0, p[problem_id]]. All the numbers in a line are separated by a space.
Output Specification:
For each test case, you are supposed to output the ranklist in the following format:
rank user_id total_score s[1] ... s[K]
where rank is calculated according to the total_score, and all the users with the same total_score obtain the same rank; and s[i] is the partial score obtained for the i-th problem. If a user has never submitted a solution for a problem, then "-" must be printed at the corresponding position. If a user has submitted several solutions to solve one problem, then the highest score will be counted.
The ranklist must be printed in non-decreasing order of the ranks. For those who have the same rank, users must be sorted in nonincreasing order according to the number of perfectly solved problems. And if there is still a tie, then they must be printed in increasing order of their id's. For those who has never submitted any solution that can pass the compiler, or has never submitted any solution, they must NOT be shown on the ranklist. It is guaranteed that at least one user can be shown on the ranklist.
Sample Input:
7 4 20
20 25 25 30
00002 2 12
00007 4 17
00005 1 19
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 1 18
00004 3 25
00002 2 25
00005 3 22
00006 4 -1
00001 2 18
00002 1 20
00004 1 15
00002 4 18
00001 3 4
00001 4 2
00005 2 -1
00004 2 0
Sample Output:
1 00002 63 20 25 - 18
2 00005 42 20 0 22 -
2 00007 42 - 25 - 17
2 00001 42 18 18 4 2
5 00004 40 15 0 25 -
思路
- ①第一次提交没通过编译得分为
0 - ②排序顺序:总分 > 完美解题数 > id
代码
#include<bits/stdc++.h>
using namespace std;
struct record
{
int id;
int score[5];
bool flag; // 判断有没有通过编译的提交
int total_score;
int perfect;
}a[10010];
int p[6];
int n, k, m;
bool cmp(record a, record b)
{
if(a.total_score != b.total_score)
return a.total_score > b.total_score;
else if(a.perfect != b.perfect)
return a.perfect > b.perfect;
else
return a.id < b.id;
}
void init()
{
for(int i=1;i<=n;i++)
{
a[i].id = i;
memset(a[i].score, -1, sizeof(a[i].score)); //默认设置为没有通过编译
a[i].total_score = 0;
a[i].flag = false;
a[i].perfect = 0;
}
} //初始化
int main()
{
scanf("%d%d%d", &n, &k, &m);
init();
for(int i=0;i<k;i++) scanf("%d", &p[i]);
int id, pos, mark;
for(int i=0;i<m;i++)
{
scanf("%d%d%d", &id, &pos, &mark);
pos -= 1; //p[]数组是从0开始的,对齐索引
if(mark != -1) a[id].flag = true; //只要不是编译错误,那么起码有一次有效提交
if(mark == p[pos] && a[id].score[pos] < p[pos]) a[id].perfect++; //第一次通过满分提交就 完美解决+1 避免多次统计
if(mark == -1 && a[id].score[pos] == -1) a[id].score[pos] = 0; //第一次编译错误,分值记为0分,例子:00005 2 -1 对应分数为0
if(mark > a[id].score[pos]) a[id].score[pos] = mark; //超过之前的得分就覆盖
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(a[i].score[j] != -1)
a[i].total_score += a[i].score[j];
}
}
sort(a + 1, a + n + 1, cmp);
int rank = 1;
for(int i=1;i<=n;i++)
{
if(!a[i].flag)
continue; //一题都没对的不用考虑
else
{
if(i > 1 && a[i].total_score != a[i-1].total_score) rank = i;
printf("%d %05d %d", rank, a[i].id, a[i].total_score);
for(int j=0;j<k;j++)
if(a[i].score[j] == -1)
printf(" -");
else
printf(" %d", a[i].score[j]);
printf("\n");
}
}
return 0;
}
引用
https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032
PTA(Advanced Level)1075.PAT Judge的更多相关文章
- PAT (Advanced Level) 1075. PAT Judge (25)
简单模拟题. 注意一点:如果一个人所有提交的代码都没编译通过,那么这个人不计排名. 如果一个人提交过的代码中有编译不通过的,也有通过的,那么那份编译不通过的记为0分. #include<cstd ...
- PTA(Advanced Level)1025.PAT Ranking
To evaluate the performance of our first year CS majored students, we consider their grades of three ...
- PAT 1075 PAT Judge[比较]
1075 PAT Judge (25 分) The ranklist of PAT is generated from the status list, which shows the scores ...
- PAT 甲级 1075 PAT Judge (25分)(较简单,注意细节)
1075 PAT Judge (25分) The ranklist of PAT is generated from the status list, which shows the scores ...
- PTA 10-排序5 PAT Judge (25分)
题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge (25分) The ranklist of PA ...
- PTA(Advanced Level)1036.Boys vs Girls
This time you are asked to tell the difference between the lowest grade of all the male students and ...
- PAT 1075. PAT Judge (25)
题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1075 此题主要考察细节的处理,和对于题目要求的正确理解,另外就是相同的总分相同的排名的处理一定 ...
- PTA (Advanced Level)1035.Password
To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...
- PAT甲级1075 PAT Judge
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032 题意: 有m次OJ提交记录,总共有k道 ...
随机推荐
- Java项目笔记01
1 Tomcat问题 1 今天用了Ecplise和MyEcplise想着用同一个路径下的Tomcat,但是却发现配置完Ecplise后MyEcplise却不能用了,并且后面在bin里启动Tomcat还 ...
- mac 使用express -e ./
利用express构建一个简单的Node项目 命令: express -e ./ -e表示使用ejs作为模板 ./表示当前目录中 使用上面的命令之前我们应该使用npm安装express框架 sudo ...
- 【luoguP2158】 [SDOI2008]仪仗队
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...
- 【luogu2668斗地主】模拟
题目描述: 输入格式: 输出格式: 输入样例: 1: 1 8 7 4 8 4 9 1 10 4 11 1 5 1 1 4 1 1 2: 1 17 12 3 4 3 2 3 5 4 10 2 3 3 1 ...
- Java开发中使用事务
一. XML,使用tx标签配置拦截器实现事务 二. Annotation方式 一.XML,使用tx标签配置拦截器实现事务 中主要配置中是tx:advice和aop:config两个 ...
- bzoj4152
The Captain HYSBZ - 4152 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input ...
- c 判断一个字符是否为字母数字
#include <stdio.h> #include <wctype.h> int main () { int i; wchar_t str[] = L"c3po. ...
- sprintf简介
sprintf 基本用法 输入一段有特点的字符串 #include <cstdio> #include <cstring> using namespace std; int m ...
- 虚拟机扩展Linux根目录磁盘空间
简要扩展空间方法http://www.kwx.gd/CentOSApp/Xen-Centos6-Mounted-HardDrive.html 最近在VMware虚拟机上使用Centos,用着用着,发现 ...
- JVM | 分代垃圾回收策略的基本概念以及过程
一.为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对 ...