PAT 1075 排序

题目

给出每个人答题的提交过程,按照题目要求排序

  1. 观察输入输出,可以发现,如果一个人提交了但是没有编译通过,即成绩为 - 1 的时候,他也是有成绩的不过是 0,但如果对这道题目没有过提交记录,则输出“-”
  2. 如果一个人对所有的成绩都没有提交或者他所有的提交都没有被编译通过,那么这个人是不计入最后的排名表的
  3. 记录每个人每道题目的最高成绩
  4. 输出的时候,按照总分降序输出,如果总分一样,按照完美解决问题的个数来输出,如果都一样按照学生id从小到大输出。

代码和思路

  1. 首先就是要区分一个用户是否输出,所以在定义用户结构体中加入flag,来记录他是否有有效的提交(如果有一次有效的提交那么这个人就是有效的)
  2. 为了区分每一道题目最后到底是输出 - 1 还是输出 0 (提交不通过和未提交是不同的输出),将每个题目的成绩初始化为 - 1,如果提交了编译未通过,则将 - 1更改为 0
  3. 如果当前提交成绩大于已提交的,就要进行更新,同时判断是否为满分,满分的话solve也要 + 1
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10010;
const int maxp = 6;
struct student {
	int id ;
	int p[maxp];
	bool flag;
	int sum ;
	int solve ;
}user[maxn];

int k, n, m;
int score[maxp];

bool cmp(student a, student b) {
	if (a.flag != b.flag) return a.flag > b.flag;
	else if (a.sum != b.sum) return a.sum > b.sum;
	else if (a.solve != b.solve) return a.solve > b.solve;
	else return a.id < b.id;
}

void init() {
	for (int i = 1; i <= n; i++) {
		user[i].id = i;
		user[i].sum = 0;
		user[i].solve = 0;
		user[i].flag = false;
		fill(user[i].p + 1, user[i].p + k + 1, -1);
	}
}

int main() {
	int id, pro, sc;
	int count = 0;
	scanf("%d %d %d", &n, &k, &m);
	for (int i = 1; i <= k; i++) {
		scanf("%d", &score[i]);
	}
	init();
	for (int i = 0; i < m; i++) {
		scanf("%d %d %d", &id, &pro, &sc);
		if (sc != -1) {
			user[id].flag = true;
		}
		if (sc == -1 && user[id].p[pro] == -1) {
			user[id].p[pro] = 0;
		}
		if (sc > user[id].p[pro]) {
			user[id].p[pro] = sc;
			if (sc == score[pro]) {
				user[id].solve++;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= k; j++) {
			if (user[i].p[j] != -1)
				user[i].sum += user[i].p[j];
		}
	}
	sort(user + 1, user + n + 1, cmp);
	int rank = 1;
	for (int i = 1; i <= n && user[i].flag == true; i++) {
		if (i > 1 && user[i].sum != user[i - 1].sum) rank = i;
		printf("%d %05d %d", rank, user[i].id, user[i].sum);
		for (int j = 1; j <= k; j++) {
			if (user[i].p[j] == -1) printf(" -");
			else printf(" %d", user[i].p[j]);
		}
		printf("\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值