1075 PAT Judge

思路解析

题目大意应该都懂,点一下坑点:
1. 当总分相同,要按照“得满分”题目的个数进行降序;
2. 没提交过的和一次都没通过编译的人不参与排名,与得0分的是两个意思;
3. 哪一道题编译没通过就输出‘-’。

示例代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, k, m;
struct node{
public:
	int id,score = 0,num = 0;
	int arr[6] = {-1,-1,-1,-1,-1,-1};
	bool issub[6];//对每一道题是否提交过,没提交过输出-
	bool hascom = false;//通过一次编译
	bool hassub = false;//提交过
};
bool cmp(node n1,node n2) {
	return n1.score != n2.score ? n1.score > n2.score : n1.num != n2.num ? n1.num > n2.num : n1.id < n2.id;
}
int main() {
	scanf("%d %d %d", &n, &k, &m);
	vector<int> que(k+1);
	vector<node> vec(n + 1);
	for (int i = 1; i <= k; i++) 
		scanf("%d", &que[i]);
	for (int i = 0; i < m; i++) {
		int uid, qid, sco;
		scanf("%d %d %d", &uid, &qid, &sco);
		vec[uid].id = uid;
		vec[uid].issub[qid] = true;
		vec[uid].hassub = true;//这个人提交过
		if (sco != -1) //编译通过
			vec[uid].hascom = true;
		if (sco > vec[uid].arr[qid]) {//当前提交的分数比原来大
			if (sco == que[qid]) //完美解题
				vec[uid].num++;
			vec[uid].arr[qid] = sco;			
		}
	}
	for (int i = 1; i <= n; i++) {//统计总分
		for (int j = 1; j <= k; j++) {
			if (vec[i].arr[j] >= 0) 
			vec[i].score += vec[i].arr[j];
		}
	}
	sort(vec.begin(), vec.end(), cmp);
	int rank = 1, pre = vec[0].score, count = 0;
	for (int i = 0; i < n + 1; i++) {//因为排完序了,0号占据了元素
		if (!vec[i].hascom || !vec[i].hassub) continue;//虽然continue掉了,但是排名还是多计了
		count++;
		if (vec[i].score == pre) 
			cout << rank << " ";
		else {
			cout << count << " ";
			rank = count;
			pre = vec[i].score;
		}
		printf("%05d %d", vec[i].id, vec[i].score);
		for (int j = 1; j < k + 1; j++) {
			if (!vec[i].issub[j]) //没有提交过
				cout << " -";
			else 
				vec[i].arr[j] == -1 ? cout << " 0" : cout << " " << vec[i].arr[j];
		}
		cout << endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值