PAT 1075. PAT Judge (模拟题)

来源:互联网 发布:c语言开发应用程序 编辑:程序博客网 时间:2024/05/01 03:31

n个用户(1...n), k门课程(1...k), m次提交,模拟PAT排名。


总得分高的排名前;

总得分相等,满分题数多的排名前;

满分题数仍相等,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;}


0 0
原创粉丝点击