1075. PAT Judge (25)

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值