PAT甲级 1075 PAT Judge (25 分) (模拟)

题目链接:传送门

思路:分数用-2表示未提交,-1表示编译未通过,用结构体直接模拟排序即可。

代码:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;

struct node {
	int id , rank , sum , num;
	int po[6];
	bool operator < (const node b)const {
		return rank < b.rank || (rank == b.rank && num > b.num) || (rank == b.rank && num == b.num && id < b.id);
	}
}a[maxn];

bool cmp(node c , node d) {
	return c.sum  > d.sum;
}


int f[6];

int main() {
	int n , k , m;
	ios::sync_with_stdio(0);
	cin >> n >> k >> m;
	for(int i = 0 ; i < k ; i++)cin >> f[i];
	for(int i = 0 ; i < n ; i++) {
		for(int j = 0 ; j < k ; j++) {
			a[i].po[j] = -2;
			a[i].id = i + 1;
		}
	}
	for(int i = 0 ; i < m ; i++) {
		int u_id;
		int t_id , sc;
		cin >> u_id >> t_id >> sc;
		if(a[u_id - 1].po[t_id - 1] < sc)a[u_id - 1].po[t_id - 1] = sc;
	}
	for(int i = 0 ; i < n ; i++) {
		for(int j = 0 ; j < k ; j++) {
			if(a[i].po[j] >= 0)
			a[i].sum += a[i].po[j];
			//cout << " i = " << i << " po=" << a[i].po[j] << "sum = " << a[i].sum << "\n";
			if(a[i].po[j] == f[j])a[i].num++;
		}
	}
	sort(a , a + n , cmp);
	a[0].rank = 1;
	for(int i = 1 ; i < n ; i++) {
		if(a[i].sum == a[i - 1].sum)a[i].rank = a[i - 1].rank;
		else a[i].rank = i + 1;
	}
	sort(a , a + n);
	for(int i = 0 ; i < n ; i++) {
		if(a[i].sum == 0) {
			bool flag = 0;
			for(int j = 0 ; j < k ; j++) {
				if(a[i].po[j] >= 0) {
					flag = 1;break;
				}
			}
			if(!flag)continue;
		} 
		cout << a[i].rank; 
		cout << " " << setw(5) << setfill('0') << a[i].id;
		cout << " " << a[i].sum;
		for(int j = 0 ; j < k ; j++) {
			if(a[i].po[j] >= 0)cout << " " << a[i].po[j];
			else if(a[i].po[j] == -2)cout << " " << "-";
			else cout << " " << 0;
		}
		cout << "\n";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/103220902