PAT 1075. PAT Judge (模拟题)
2014-04-15 09:29
316 查看
n个用户(1...n), k门课程(1...k), m次提交,模拟PAT排名。
总得分高的排名前;
总得分相等,满分题数多的排名前;
满分题数仍相等,id小的排名前。
从未提交 或 提交代码从未通过编译的用户不予输出。
注意到,输出用户信息时,该用户从未提交过的题目输出为"-"; 提交过未得到分的(得分为0或编译未通过的),则输出"0".
总得分高的排名前;
总得分相等,满分题数多的排名前;
满分题数仍相等,id小的排名前。
从未提交 或 提交代码从未通过编译的用户不予输出。
注意到,输出用户信息时,该用户从未提交过的题目输出为"-"; 提交过未得到分的(得分为0或编译未通过的),则输出"0".
#include <iostream> #include <algorithm> #include <vector> #include <cstdio> //#include <map> using namespace std; struct User; int n, k, m; int p[6]; struct User { int m_rank; int m_id; int m_score[6]; int m_submit_cnt[6]; User() { for (int i = 1; i <= 5; ++ i) { m_score[i] = -1; m_submit_cnt[i] = 0; } } friend bool operator< (const User& a, const User& b) { int aa = a.get_tot_score(); int bb = b.get_tot_score(); if (aa != bb) { return aa > bb; } else if (a.get_perfect_num() != b.get_perfect_num()) { return a.get_perfect_num() > b.get_perfect_num(); } else { return a.m_id < b.m_id; } } int get_tot_score() const { int ret = -1; for (int i = 1; i <= k ; ++ i) { if (m_score[i] != -1) { // 最终可以让从未提交、或从未通过编译的用户排在最末尾 if (ret == -1) { ret = 0; } ret += m_score[i]; } } return ret; } int get_perfect_num() const { int ret = 0; for (int i = 1; i <= k; ++ i) { if (m_score[i] == p[i]) { ++ ret; } } return ret; } bool print() const { bool should_print = false; for (int i = 1; i <= k; ++ i) { if (m_score[i] != -1) { should_print = true; break; } } if (should_print == false) { return false; } printf("%d %05d %d", m_rank, m_id, get_tot_score()); for (int i = 1; i <= k; ++ i) { if (m_submit_cnt[i] > 0) { if (m_score[i] == -1) { printf(" 0"); } else { printf(" %d", m_score[i]); } } else { printf(" -"); } } printf("\n"); return true; } }; User user[10010]; int main() { int course_id, score, user_id; scanf("%d%d%d", &n, &k, &m); for (int i = 1; i <= k; ++ i) { scanf("%d", p+i); } for (int i = 0; i < m; ++ i) { scanf("%d%d%d", &user_id, &course_id, &score); user[user_id].m_id = user_id; ++ user[user_id].m_submit_cnt[course_id]; if (user[user_id].m_score[course_id] < score) { user[user_id].m_score[course_id] = score; } } sort(user+1, user+n+1); user[1].m_rank = 1; for (int i = 2; i <= n; ++ i) { if (user[i].get_tot_score() == user[i-1].get_tot_score()) { user[i].m_rank = user[i-1].m_rank; } else { user[i].m_rank = i; } } for (int i = 1; i <= n; ++ i) { if (user[i].print() == false) { break; } } return 0; }
相关文章推荐
- 关于指针的一些事情
- Linux Shell - 如何使用sort与uniq命令删除重复的文本行
- Transformation 能将 Windows XP/Server 2003 操作系统,完美地模拟成 Windows Vista 的软件
- 用javascript和css模拟select的脚本
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C与C++之间相互调用实例方法讲解
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- C++ Primer 第一部分基本语言
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题