PAT A1025 PAT Ranking

//呵,自己写的,一点没看书,至少example的正确通过了 
//第一次提交,全部错误,发现是9没有输出。
//另外发现排序这种题 ,好像边界值出现不太多 
#include<cstdio>
#include<cstring> 
#include<algorithm>
using namespace std;//我靠,这次又忘写了!!! 
//#define LOCAL
struct Testee{
	char tid[15];
	int grade,fr,lr,ll;
}stu[30010];
bool cmp(Testee a,Testee b){
	if(a.grade!=b.grade) return a.grade>b.grade;//按成绩从大到小排 
	else return strcmp(a.tid,b.tid)<0;//从学号小到大排 
} 
int main(){
	#ifdef LOCAL
	freopen("A1025data.in","r",stdin);
	freopen("A1025data.out","w",stdout);
	#endif
	int n,m,num=0;//表示n个考场 
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&m);//m个同学
		for(int j=0;j<m;j++){
			scanf("%s %d",stu[num].tid,&stu[num].grade);
			stu[num].ll=i+1;
			num++;
		}//这样就输入完了一个考场的所有学生
		//本考场排序 
		sort(stu+num-m,stu+num,cmp);//这样本考场就排了序了
		stu[num-m].lr=1;
		for(int k=num-m+1;k<num;k++){
			if(stu[k].grade==stu[k-1].grade) stu[k].lr=stu[k-1].lr;
			else stu[k].lr=k+1-(num-m);//这样应该对哈。lr赋值完毕 
		} 
	}
	//所有数值输入完毕后,按照指定规则全排列
	sort(stu,stu+num,cmp);
	stu[0].fr=1;
	for(int i=1;i<num;i++){
		if(stu[i].grade==stu[i-1].grade) stu[i].fr=stu[i-1].fr;
		else stu[i].fr=i+1;
	}
	printf("%d\n",num);//这一样差点忘记了! 
	for(int i=0;i<num;i++){
		printf("%s %d %d %d\n",stu[i].tid,stu[i].fr,stu[i].ll,stu[i].lr);
	}
	return 0; 
} 

你可能感兴趣的:(C++,算法,pat)