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 (≤), the total number of users, K (≤), the total number of problems, and M (≤), 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 − 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 -

题意:

  根据分数进行排序。

思路:

  这种题难道是不难就是细节太多,有一点忽略掉的话,就会被样例卡掉,更重要的是当自己写好代码之后还信心满满的认为自己写的是对的,找起bug来真的很难。

Code:

#include <bits/stdc++.h>

using namespace std;

struct User {
int id;
int rank;
int total_score = 0;
int NumOfPerfect = 0;
bool shown = false;
vector<int> problems;
}; bool cmp(User a, User b) {
if (a.total_score != b.total_score)
return a.total_score > b.total_score;
else if (a.NumOfPerfect != b.NumOfPerfect)
return a.NumOfPerfect > b.NumOfPerfect;
else
return a.id < b.id;
} int main() {
int n, k, m;
cin >> n >> k >> m;
vector<int> score(k + 1);
for (int i = 1; i <= k; ++i) cin >> score[i];
vector<User> users(n + 1);
int user_id, pro_id, pso;
for (int i = 1; i <= n; ++i) users[i].problems.resize(k + 1, -1);
for (int i = 0; i < m; ++i) {
cin >> user_id >> pro_id >> pso;
users[user_id].id = user_id;
int temp = users[user_id].problems[pro_id];
users[user_id].problems[pro_id] = max(pso, temp);
if (pso != -1)
users[user_id].shown = true;
else if (users[user_id].problems[pro_id] == -1)
users[user_id].problems[pro_id] = -2;
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= k; ++j) {
if (users[i].problems[j] != -1 && users[i].problems[j] != -2)
users[i].total_score += users[i].problems[j];
if (users[i].problems[j] == score[j]) users[i].NumOfPerfect++;
}
}
sort(users.begin() + 1, users.end(), cmp); for (int i = 1; i <= n; ++i) {
users[i].rank = i;
if (i != 1 && users[i].total_score == users[i - 1].total_score)
users[i].rank = users[i - 1].rank;
}
for (int i = 1; i <= n; ++i) {
if (users[i].shown) {
printf("%d %05d %d", users[i].rank, users[i].id,
users[i].total_score);
for (int j = 1; j <= k; ++j) {
if (users[i].problems[j] != -1 && users[i].problems[j] != -2)
printf(" %d", users[i].problems[j]);
else if (users[i].problems[j] == -1)
printf(" -");
else
printf(" 0");
}
printf("\n");
}
}
return 0;
}

参考:

  https://www.liuchuo.net/archives/2260

1075 PAT Judge的更多相关文章

  1. PAT 1075 PAT Judge[比较]

    1075 PAT Judge (25 分) The ranklist of PAT is generated from the status list, which shows the scores ...

  2. PAT 甲级 1075 PAT Judge (25分)(较简单,注意细节)

    1075 PAT Judge (25分)   The ranklist of PAT is generated from the status list, which shows the scores ...

  3. PAT 1075. PAT Judge (25)

    题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1075 此题主要考察细节的处理,和对于题目要求的正确理解,另外就是相同的总分相同的排名的处理一定 ...

  4. PAT甲级1075 PAT Judge

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032 题意: 有m次OJ提交记录,总共有k道 ...

  5. PAT 1075. PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submittions. Th ...

  6. PTA(Advanced Level)1075.PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  7. 1075 PAT Judge (25)

    排序题 #include <stdio.h> #include <string.h> #include <iostream> #include <algori ...

  8. PAT (Advanced Level) 1075. PAT Judge (25)

    简单模拟题. 注意一点:如果一个人所有提交的代码都没编译通过,那么这个人不计排名. 如果一个人提交过的代码中有编译不通过的,也有通过的,那么那份编译不通过的记为0分. #include<cstd ...

  9. PAT甲题题解-1075. PAT Judge (25)-排序

    相当于是模拟OJ评测,这里注意最后输出:1.那些所有提交结果都是-1的(即均未通过编译器的),或者从没有一次提交过的用户,不需要输出.2.提交结果为-1的题目,最后输出分数是03.某个题目从没有提交过 ...

随机推荐

  1. 百度AI api使用

    # *********************************baidu-api-通用文字识别******************************************** # im ...

  2. Django练习遇到的错误记录

    _reverse_with_prefix() argument after ** must be a mapping, not set 错误代码: def get_absolute_url(self) ...

  3. crontab任务重复执行?不执行?不按照配置执行?大概率是配置出错了!!!

    在使用crontab配置定时任务是,容易大意出错的配置记录,有温度的文章分享,有态度的日常记录- 一.情景1 设置每天凌晨执行某一任务,结果发现凌晨0点没分钟都执行了一次,我的天!!! 1.分析原因可 ...

  4. 什么是内存对齐,go中内存对齐分析

    内存对齐 什么是内存对齐 为什么需要内存对齐 减少次数 保障原子性 对齐系数 对齐规则 总结 参考 内存对齐 什么是内存对齐 弄明白什么是内存对齐的时候,先来看一个demo type s struct ...

  5. 一款免费的在线 Markdown 笔记,类似 typora 编辑体验

    为什么要开发一款新的编辑器 自从我开始使用 Markdown,就爱上了这种标记语法,轻量.纯文本兼容是最大的优点,哪里都可以编辑,一开始是在 IDE 上直接编辑,后来笔记越来越多,需要上传图片,有云同 ...

  6. WPF 基础 - Binding 的 数据更新提醒

    WPF 作为一个专门的展示层技术,让程序员专注于逻辑层,让展示层永远处于逻辑层的从属地位: 这主要因为有 DataBinding 和配套的 Dependency Property 和 DataTemp ...

  7. editplus更改编码

    1.在Tools下拉后选择Configure User Tools 2.在左边导航菜单找到File,对应右边视图中的Default encoding 3.将编码更改为utf-8,点击底部的OK保存.

  8. POJ_2387 Til the Cows Come Hom 【最短路】

    一.题目 POJ2387 二.分析 Bellman-Ford算法 该算法是求单源最短路的,核心思想就是不断去更新到起点的最短距离,更新的前提是没有负边.如果有负边需要手动控制循环次数. Dijkstr ...

  9. menuStrip鼠标滑过自动弹出

    public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } private void 退出系统T ...

  10. EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录

    前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...