1075. PAT Judge (25)
2015-11-24 22:06
309 查看
1.该题有几个需要注意的点
1)-1表示提交了但是没有编译通过,在最终输出的时候需要显示0分
2)完全没有记录的,表示没有提交过,在最终输出的时候需要显示-
3)在排名时,要把0分的也进行排名,如下面的测试例子:
8 4 21
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
00008 4 0
正确答案应该为:
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 -
6 00008 0 - - - 0
8号用户虽然0分,但是有提交过,所以排名是有的
AC代码:
1)-1表示提交了但是没有编译通过,在最终输出的时候需要显示0分
2)完全没有记录的,表示没有提交过,在最终输出的时候需要显示-
3)在排名时,要把0分的也进行排名,如下面的测试例子:
8 4 21
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
00008 4 0
正确答案应该为:
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 -
6 00008 0 - - - 0
8号用户虽然0分,但是有提交过,所以排名是有的
AC代码:
//#include<string> //#include <iomanip> //#include<stack> //#include<unordered_set> //#include <sstream> //#include "func.h" //#include <list> #include<unordered_map> #include<set> #include<queue> #include<map> #include<vector> #include <algorithm> #include<stdio.h> #include<iostream> #include<string> #include<memory.h> #include<limits.h> #include<stack> using namespace std; /* 8 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 8 4 21 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 00008 4 0 1 1 1 20 00001 1 15 */ struct UserNode{ int id; int rank; vector<int> score; int totalScore; int perfectSubmit; int noSubmit; UserNode() :id(0), rank(0), score(0), totalScore(0), perfectSubmit(0),noSubmit(0){}; UserNode(vector<int> a) :id(0), rank(0), score(a), totalScore(0), perfectSubmit(0), noSubmit(0){}; }; bool cmp(const UserNode&a, const UserNode&b) { if (a.totalScore > b.totalScore) return true; else if (a.totalScore == b.totalScore) { if (a.perfectSubmit > b.perfectSubmit) return true; else if (a.perfectSubmit == b.perfectSubmit && a.id < b.id) return true; else return false; } else return false; } int main(void) { int userSum, problemSum, submitSum; cin >> userSum >> problemSum >> submitSum; vector<UserNode> user(userSum); for (int i = 0; i < user.size(); i++) {//初始化每个用户的每个题目的分数 user[i].score = vector<int>(problemSum, -2); } vector<int> fullScore(problemSum); for (int i = 0; i < fullScore.size(); i++) {//输入满分的分值 cin >> fullScore[i]; } for (int i = 0; i < submitSum; i++) {//输入提交记录 int id,problemID, score; scanf("%d %d %d", &id, &problemID, &score); user[id - 1].id = id;//记录id user[id - 1].score[problemID - 1] = max(user[id - 1].score[problemID - 1],score);//取最高分,-1表示没有通过编译 } for (int i = 0; i < user.size(); i++) {//统计学生的具体成绩 user[i].totalScore = 0; for (int j = 0; j < problemSum; j++) { if (user[i].score[j] >=0)//大于等于0,即通过编译器 user[i].totalScore += user[i].score[j]; else //-1为提交了没通过编译器,-2为没提交 user[i].noSubmit++; if (user[i].score[j] == fullScore[j])//如果分数是满分,perfect++ user[i].perfectSubmit++; } } sort(user.begin(), user.end(), cmp); user[0].rank = 1;//一个用户排名第一 printf("%d %05d %d", user[0].rank, user[0].id, user[0].totalScore); for (int j = 0; j < problemSum; j++) { if (user[0].score[j] >=0) printf(" %d", user[0].score[j]); else if (user[0].score[j] == -1) printf(" 0");//-1,提交了不通过,0分 else//-2,没有提交过 printf(" -"); } printf("\n"); for (int i = 1; i < user.size(); i++) { //即使分数为0的,也要统计排名 if (user[i].totalScore == user[i-1].totalScore) user[i].rank = user[i - 1].rank; else user[i].rank = i+1; if (user[i].noSubmit != problemSum) { //输出用户信息 printf("%d %05d %d", user[i].rank, user[i].id, user[i].totalScore); for (int j = 0; j < problemSum; j++) { if (user[i].score[j] >= 0)//如果用户的分数大于等于0,则输出分数 printf(" %d", user[i].score[j]); else if (user[i].score[j] == -1) printf(" 0");//-1,提交了不通过,0分 else //-2,没有提交过,输出横线 printf(" -"); } printf("\n"); } } return 0; }
相关文章推荐
- 贪婪算法小结
- POJ 1195 Mobile phones 【二维树状数组】
- javaSE(02)
- 第二次spring冲刺第1天
- 1075. PAT Judge (25)
- 我遇到的错误提示:reason: '*** setObjectForKey: object cannot be nil (key: id)' 的病因
- 约瑟夫问题解决及实现代码(C语言版)
- Oracle体系结构总结
- JS 动态加载 CSS 文件和JS文件,加载图片
- MySQL 复制滞后与延时复制
- Mysql优化
- 小鑫need help
- 小鑫的投篮
- 2015年Java代码之02
- DDR2基础
- Bootstrap历练实例:基本按钮组
- 去掉网页从网页中拷贝到word中段落带有的背景颜色
- [TwistedFate]UITableViewCell自定义-02
- SDRAM基础
- Bootstrap 按钮组