A1025 patranking和算法笔记的思路不同

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
struct student{
	char name[15];
	int s,kc,r,local;
}stu[30010];//定义所有学生结构体!一定要注意这里的取值!
//题目规定不超过100个考场!每个考场不超过300个人! 即该值不小于100×300=30000人!! 

bool cmp(student a,student b){
	if(a.s!=b.s) return a.s>b.s;
	else return strcmp(a.name,b.name)<0;  
}//定义比较函数 

int main(){
	int i,j,k=0,n,a,b=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&a);
		b+=a;
		for(j=0;j<a;j++){
			++k;
			scanf("%s %d",&stu[k].name,&stu[k].s);
			stu[k].kc=i;//记录考场! 
		}
	}//分考场输入所有学生分数,并且记录考场!
	printf("%d\n",b); 
	
	sort(stu+1,stu+k+1,cmp);//全局排序!! 
	/*for(i=1;i<=k;i++){
		printf("%s %d %d %d\n",stu[i].name,stu[i].r,stu[i].kc,stu[i].local);
	}//(用来测试!)全局输出!!! */
	
	for(i=1;i<=k;i++){
		if(i!=1&&stu[i].s==stu[i-1].s) stu[i].r=stu[i-1].r;
		else stu[i].r=i;
	}//全局排名!!!!!! 
	
	int now=0,bef=0;
	for(i=0;i<n;i++){//n个教室 
		for(j=1;j<=k;j++){
			if(stu[j].kc==i+1){//是该考场则记录!
				 now++;
				if(j!=1&&stu[j].s==stu[bef].s)
				stu[j].local=stu[bef].local;
				else stu[j].local=now;
				bef=j;
			}
	
		}
		now=0;
	}//分教室排名!!!!! 
	
	for(i=1;i<=k;i++){
		printf("%s %d %d %d\n",stu[i].name,stu[i].r,stu[i].kc,stu[i].local);
	}//全局输出!!! 
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章