您的位置:首页 > 其它

1075. PAT Judge (25)

2015-11-24 22:06 489 查看
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代码:

//#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: