排序 1075 PAT Judge (25 分) ***

思路不清晰

memset初始化(数组,初始的数值,sizeof(数组))

排序顺序得是
先排除一个提交都没有的人;
再按总分排列;
再按完美接替数;
再按id;

提交错误的-1 分数实际是0;

可以直接输入uid , pid ,作为数组的下标

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef struct node
{
	int uid;
	int score[10];
	int tscore;
	bool flag;
	int per; 
}record; 

record r[100010];

void initia(int n)
{
	for(int i=1;i<=n;i++)
	{
		r[i].uid = i;
		r[i].tscore = 0;
		r[i].flag = false;
		r[i].per = 0;
		memset(r[i].score,-1,sizeof(r[i].score));
	}
}

bool cmp(record a, record b)
{
	if(a.tscore != b.tscore)
		return a.tscore > b.tscore;
	else if(a.per != b.per)
		return a.per>b.per;
	else if(a.uid != b.uid)
		return a.uid < b.uid;
}

int main()
{
	int n,k,m,full[10];
	int tu,tp,ts;
	scanf("%d %d %d",&n,&k,&m);
	for(int i =1;i<=k;i++)
	{
		scanf("%d",&full[i]);
	}
	initia(n);
	
	for(int i =0 ;i<m;i++)
	{
		scanf("%d %d %d",&tu,&tp,&ts);
		if(ts!=-1)
		{
			r[tu].flag = true;
		}
		if(ts == -1 && r[tu].score[tp] == -1)
		{
			r[tu].score[tp] = 0;
		}
		if(ts == full[tp] && r[tu].score[tp]<full[tp])
		{
			r[tu].per++;
		}
		if(ts>r[tu].score[tp])
		{
			r[tu].score[tp] = ts;
		}
	}
	for(int i = 1;i<=n;i++)
	{
		for(int j =1;j<=k;j++)
			{
				if(r[i].score[j] != -1)
					r[i].tscore += r[i].score[j];
					
			} 
	}
	sort(r+1,r+n+1,cmp);
	int rank = 1;
	int temp = 0;
	for(int i =1 ;i<=m && r[i].flag == true;i++)
	{
		temp++;
		if(i>1 && r[i].tscore != r[i-1].tscore)
		{
			rank=temp;
			
		}
		printf("%d %06d %d",rank,r[i].uid,r[i].tscore);
		for(int j = 1;j<=k;j++)
		{
			if(r[i].score[j] == -1)
				printf(" -");
			else
				printf(" %d",r[i].score[j]);
		}
		printf("\n");
	}
	
	
	return 0;	
} 

猜你喜欢

转载自blog.csdn.net/qq_15556537/article/details/88980848