【PAT甲级】1075 PAT Judge (25分)

解题过程的小记录,如有错误欢迎指出。

难度:两星(这简直是英语阅读理解题嘛)

题目分析

给出一堆提交记录,要求按给定的规则输出排名

注意点

  1. 提交成功过的人,如果有题目编译不通过显示的是0而不是"-"
  2. 从来没有通过编译的人不显示
  3. 通过一次编译哪怕总分是0分也显示
  4. "-"代表此题从未提交过而不是提交了编译不通过

我的解题过程

思路

设置user结构体【此题的难点在于结构体的设置,因为要分辨是从未提交的总分0还是提交过后的总分0,此种样例在给出的例子中没有但检测点中有】,输入数据,采用first结构变量进行标识此人有否成功通过编译过,然后采用flag[]来标记某一题是否提交过【若提交过哪怕是不通过编译也显示0,否者显示"-"】。输入完数据后采用valid数组输入有效的数据进行排名显示

bug

因为刚开始没有理解透什么需要输出,忽略输出了总分为0但通过编译的人需要输出所以错误

代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int K;//总题数
int s[5];//各题的分数

struct user {
	int id;
	int score[5] = { 0 };
	bool flag[5] = { false };//用来记录该题是否提交过
	int total = 0;
	int perfect = 0;
	int rank;
	bool first = false;
};

int comp1(user u1, user u2) {
	if (u1.total != u2.total) return u1.total > u2.total;
	else return u1.perfect != u2.perfect ? u1.perfect > u2.perfect:u1.id < u2.id;
}

int main()
{
	int N, M;
	cin >> N >> K >> M;
	for (int i = 0; i < K; i++) {
		cin >> s[i];
	}
	vector<user> users(N), valid;
	for (int i = 0; i < N; i++) {
		users[i].id = i + 1;
	}
	for (int i = 0; i < M; i++) {
		int id, pro_num, pro_score;
		cin >> id >> pro_num >> pro_score;
		id--;
		pro_num--;
		if (pro_score != -1) users[id].first = true; //**关键点:说明第一次通过编译,那么此人不管总分多少都会有显示
		if (users[id].flag[pro_num] == false) {
			users[id].flag[pro_num] = true;
			if (pro_score != -1) {
				users[id].score[pro_num] = pro_score;
			}
		}
		else {
			if (pro_score > users[id].score[pro_num])
				users[id].score[pro_num] = pro_score;
		}
	}
	for (int i = 0; i < N; i++) {
		//bool f = false;********有了first变量后这个就不需要了
		for (int j = 0; j < K; j++) {
			//if (users[i].flag[j] == true) f = true;
			if (users[i].score[j] == s[j]) users[i].perfect++;
			users[i].total += users[i].score[j];
		}
		if (users[i].first) valid.push_back(users[i]);
	}
	sort(valid.begin(), valid.end(), comp1);
	printf("1 %05d %d", valid[0].id, valid[0].total);
	valid[0].rank = 1;
	for (int i = 0; i < K; i++) {
		if (valid[0].flag[i] != false)
			printf(" %d", valid[0].score[i]);
		else
			printf(" -");
	}
	printf("\n");
	for (int i = 1; i < valid.size(); i++) {
		if (valid[i].total == valid[i - 1].total) {
			valid[i].rank = valid[i - 1].rank;
		}
		else {
			valid[i].rank = i + 1;
		}
		printf("%d %05d %d", valid[i].rank, valid[i].id, valid[i].total);
		for (int j = 0; j < K; j++) {
			if (valid[i].flag[j] != false)
				printf(" %d", valid[i].score[j]);
			else {
				printf(" -");//这题从未提交过
			}
		}
		printf("\n");
	}
    return 0;
}

dalao的代码

全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~

借鉴点

  1. 可以在输入的时候就计算完美题数
  2. 可以将score全部初始化为-1,然后有提交时,编译不通过改为0,编译通过改为对应分数,这样就省去了flag的设置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值