【1075 25 排序】 PAT Judge

传送门

题意

给定\(id\)范围为\(1\sim n\)的人的\(k\)种程序测评成绩,\(m\)条记录,最后将所有人的排名、\(id\)、总成绩和各个成绩输出,先总成绩降序,相同满分程序数降序,相同\(id\)升序

数据范围

\(n\leq 10^{4}\)
\(k\leq 5\)
\(m\leq 10^{5}\)

题解

  • 没有提交过或者是没有编译通过的不统计
  • 相同的人相同的科目有重复成绩取最大值
  • 初始化每个科目为\(-2\),如果是\(-1\)输出时候输出\(0\),直接变为\(0\)

Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
	int id,tot=0,perfect=0,rk;
	bool f=0;
	int score[6]={-2,-2,-2,-2,-2,-2};
	bool operator < (const node t) const {
		if(tot==t.tot){
			if(perfect==t.perfect) return id<t.id;
			return perfect>t.perfect;
		}
		return tot>t.tot;
	}
};
node usr[N];
int p[6];
int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	int n,k,m; cin>>n>>k>>m;
	for(int i=1;i<=k;i++) cin>>p[i];
	while(m--){
		int a,b,c; cin>>a>>b>>c;
		usr[a].id = a;
		if(c>-1) usr[a].f=1;
		else if(c==-1) c=0;
		usr[a].score[b] = max(c,usr[a].score[b]);
	}
	vector<node>s;
	for(int i=1;i<=n;i++)
		if(usr[i].f) {
			for(int j=1;j<=k;j++)
				if(usr[i].score[j]!=-2){
					usr[i].tot+=usr[i].score[j];
					if(usr[i].score[j]==p[j]) usr[i].perfect++;
				}
			s.push_back(usr[i]);
		}
	sort(s.begin(),s.end());
	for(int i=0;i<s.size();i++){
		if(i!=0 && s[i].tot==s[i-1].tot) {
			printf("%d ",s[i-1].rk);
			s[i].rk=s[i-1].rk;
		}
		else printf("%d ",i+1),s[i].rk=i+1;
		printf("%05d %d ",s[i].id,s[i].tot);
		for(int j=1;j<=k;j++) {
			if(s[i].score[j]==-2) printf("-");
			else if(s[i].score[j]==-1) printf("0");
			else printf("%d",s[i].score[j]);
			if(j!=k) printf(" ");
			else if(j==k && i!=s.size()-1) puts("");
		}
	}
}
posted @ 2021-03-03 21:33  Hyx'  阅读(59)  评论(0)    收藏  举报