pat-1075(排序+细节)

本文详细解析了 PAT 1075 题目的核心算法思路,包括如何处理参赛者提交记录的特殊情况,以及如何根据提交状态计算最终得分。通过具体的 C++ 代码实现,展示了数据结构设计、排序比较和输出格式的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pat-1075

思路:

简单的排序,但是注意

(1)“For those who has never submitted any solution that can pass the compiler, or has never submitted any solution, they must NOT be shown on the ranklist. ”,一道题目,没有提交记录或者提交后编译失败都视为“没做”,如果所有题目都“没做”,就忽略这个人;

(2)输出时,只要这道题目有提交,得分为0和编译失败均视为0分。

搞懂这两点就比较好做了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100100;
int vis[maxn],m,n,k,p[10];
struct Node{
	int u_id,tol,sco[10],num;
	Node(){
		for(int i=0;i<10;i++) sco[i]=-2;
	}
}cur[maxn];
vector <Node> vc;
bool cmp(Node a,Node b)
{
	if(a.tol!=b.tol) return a.tol>b.tol;
	else{
		if(a.num!=b.num) return a.num>b.num;
		else return a.u_id<b.u_id;
	}
}
int MAX(int x,int y)
{
	return x>y?x:y;
}
int main(void)
{
	int pos=0,i,j,x,y,z,len,fg;
	memset(vis,0,sizeof(vis));
	scanf("%d%d%d",&n,&k,&m);
	for(i=1;i<=k;i++) scanf("%d",&p[i]);
	for(i=1;i<=m;i++){
		scanf("%d %d %d",&x,&y,&z);
		if(vis[x]==0){
			vis[x]=++pos;
			cur[pos].u_id=x;
			cur[pos].sco[y]=MAX(cur[pos].sco[y],z);
		}
		else{
			len=vis[x];
			cur[len].sco[y]=MAX(cur[len].sco[y],z);
		}
	}
	for(i=1;i<=pos;i++){
		cur[i].tol=0;cur[i].num=0;
		for(fg=0,j=1;j<=k;j++)
		if(cur[i].sco[j]>=0){
			fg=1;cur[i].tol+=cur[i].sco[j];
			if(cur[i].sco[j]==p[j]) cur[i].num++;
		}
		if(fg==1) vc.push_back(cur[i]);
	}
	sort(vc.begin(),vc.end(),cmp);
	for(i=0,len=vc.size();i<len;i++){
		if(i==0||vc[i].tol!=vc[i-1].tol) x=i+1;
		printf("%d %05d %d",x,vc[i].u_id,vc[i].tol);
		for(j=1;j<=k;j++)
		if(vc[i].sco[j]==-2) printf(" -");
		else if(vc[i].sco[j]==-1) printf(" 0");
		else printf(" %d",vc[i].sco[j]);
		printf("\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值