PTA(Basic Level) 1085:PAT单位排行(C语言实现)

PTA(Basic Level) 1085:PAT单位排行(C语言实现)

分析:不要输入一个信息从头对比有没有相同的学校名字,会超时。

#include 
#include 
#include 
#include 
struct school
{
	char name[7];
	int t,a,b,g,count;
}sch[100000]={0};

void toLowerName(char s[])//把学校名字转换为小写
{
	int i;
	for(i=0; s[i]; i++)
		s[i]=tolower(s[i]);
}

int cmp_name(const void *a,const void *b)//按学校名字排序
{
	return strcmp(((struct school*)a)->name,((struct school*)b)->name);
}

int cmp(const void *a,const void *b)//按输出要求排序
{
	struct school *p=(struct school*)a;
	struct school *q=(struct school*)b;
	if(p->g != q->g)
		return q->g - p->g;
	else
	{
		if(p->count != q->count)
			return p->count - q->count;
		else
			return strcmp(p->name,q->name);
	}
}

int main()
{
	int n,i,k=0,score,rank=1;
	char sch_name[7]="",id[7]="";
	scanf("%d",&n);
	for(i=0; i<n; i++)
	{
		scanf("%s%d%s",id,&score,sch_name);
		toLowerName(sch_name);
		strcpy(sch[i].name,sch_name);
		sch[i].count=1;//初始化count
		if(id[0] == 'T')//按级别输入成绩
			sch[i].t=score;
		else if(id[0] == 'A')
			sch[i].a=score;
		else
			sch[i].b=score;
	}
	qsort(sch,n,sizeof(sch[0]),cmp_name);//按学校名排序,相同的学校名相邻
	for(i=1; i<n; i++)
		if(strcmp(sch[k].name,sch[i].name) == 0)//k标记同一个学校名的信息
		{
			sch[k].count++;
			sch[k].t+=sch[i].t;
			sch[k].a+=sch[i].a;
			sch[k].b+=sch[i].b;
		}
		else
		{
			sch[k].g=(int)(sch[k].t*1.5+sch[k].a+sch[k].b/1.5);//计算总评
			sch[++k]=sch[i];
		}
	sch[k].g=(int)(sch[k].t*1.5+sch[k].a+sch[k].b/1.5);	//最后一个学校计算总评
	qsort(sch,k+1,sizeof(sch[0]),cmp);//按输出要求排序
	printf("%d\n",k+1);
	for(i=0; i<=k; i++)
	{	
		if(i>0 && sch[i].g != sch[i-1].g)//相同总评排名相同
			rank=i+1;
		printf("%d %s %d %d\n",rank,sch[i].name,sch[i].g,sch[i].count);
	}
	return 0;
}

你可能感兴趣的:(PTA(basic,level))