1075. PAT Judge (25)

    题目不难,就是加了很多限制条件,稍不留意容易出错。

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

using namespace std;

struct User{
	int id, rank, total, perfect, s[6];
	bool show;

	User() : id(0), rank(0), total(0), perfect(0){
		for(int i = 0; i < 6; ++i){
			s[i] = -2;  // not submitted
		}
		
		show = false;
	}

	bool operator < (const User& rhs) const{
		if(total != rhs.total) return total > rhs.total;
		else if(perfect != rhs.perfect) return perfect > rhs.perfect;
		else return id < rhs.id;
	}
};

User users[10005];

int main(){
	int n, k, m;
	scanf("%d%d%d", &n, &k, &m);

	vector<int> p(k+1);
	for(int i = 1; i <= k; ++i){
		scanf("%d", &p[i]);
	}

	for(int i = 0; i < m; ++i){
		int id, problem, score;
		scanf("%d%d%d", &id, &problem, &score);

		users[id].id = id;

		if(users[id].s[problem] < score){
			users[id].s[problem] = score;
			
			if(score > -1){
				users[id].show = true;
			}
		}
	}

	vector<User> result;

	for(auto& u : users){
		if(u.show){
			for(int i = 1; i <= k; ++i){
				if(u.s[i] >= 0){
					u.total += u.s[i];
				}

				if(u.s[i] == p[i]){
					++u.perfect;
				}
			}

			result.push_back(u);
		}
	}

	sort(begin(result), end(result));

	for(size_t i = 0; i < result.size(); ++i){
		if(i == 0) result[i].rank = 1;
		else{
			if(result[i].total == result[i-1].total){
				result[i].rank = result[i-1].rank;
			}else{
				result[i].rank = i+1;
			}
		}
	}

	for(auto& u : result){
		printf("%d %05d %d", u.rank, u.id, u.total);
		for(int i = 1; i <= k; ++i){
			printf(" ");
			if(u.s[i] == -2){
				printf("-");
			}else if(u.s[i] == -1){
				printf("0");
			}else{
				printf("%d", u.s[i]);
			}
		}

		printf("\n");
	}

	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值