现在的位置: 首页 > 综合 > 正文

浙大PAT 1025题 1025. PAT Ranking

2018年02月06日 ⁄ 综合 ⁄ 共 1856字 ⁄ 字号 评论关闭

排序模拟题,练练C/C++排序挺好的。

第一次:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
  char number[20];
  int score;
  int final_rank;
  int local_num;
  int local_rank;
}Info;
Info info[30005];
int cmp(const void *m,const void *n){
  Info *a=(Info *)m;
  Info *b=(Info *)n;
  if(a->score==b->score) return strcmp(a->number,b->number);
  else return a->score<b->score;
}

int main(){
  int i,j,N,K,off=0;
  scanf("%d",&N);
  for(i=1;i<=N;i++){
    scanf("%d",&K);
    for(j=off;j<off+K;j++){
      scanf("%s %d",info[j].number,&info[j].score);
      info[j].local_num=i;
    }
    qsort(info+off,K,sizeof(Info),cmp);
    for(j=off;j<off+K;j++){
      if(j!=off&&info[j].score==info[j-1].score) info[j].local_rank=info[j-1].local_rank;
      else info[j].local_rank=j-off+1;
    }
    off=off+K;
  }
  qsort(info,off,sizeof(Info),cmp);
  
  for(i=0;i<off;i++){
   if(i!=0&&info[i].score==info[i-1].score) info[i].final_rank=info[i-1].final_rank;
   else info[i].final_rank=i+1;
  }
  printf("%d\n",off);
  for(i=0;i<off;i++){
   printf("%s %d %d %d\n",info[i].number,info[i].final_rank,info[i].local_num,info[i].local_rank);
  }
  return 0;
} 
 

第二次:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct NodeType{
	char id[20];
	int score;
	int frank;
	int lnum;
	int lrank;
}Testee;
Testee t[30005];
int cmp(const void *a,const void *b){
	Testee* ta=(Testee*)a;
	Testee* tb=(Testee*)b;
	if(ta->score==tb->score){
		return strcmp(ta->id,tb->id);
	}
	else{
		return tb->score-ta->score;
	}
}
int main(){
	int i,j,k,n;
	int cnt=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%d",&k);
		int tmp=cnt;
		for(j=0;j<k;j++){
			scanf("%s %d",t[cnt].id,&t[cnt].score);
			t[cnt].lnum=i+1;
			cnt++;
		}
		qsort(t+tmp,cnt-tmp,sizeof(Testee),cmp);
		t[tmp].lrank=1;
		for(j=tmp+1;j<cnt;j++){
			if(t[j].score==t[j-1].score){
				t[j].lrank=t[j-1].lrank;
			}
			else{
				t[j].lrank=j-tmp+1;	
			}
		}
	}
	qsort(t,cnt,sizeof(Testee),cmp);
	t[0].frank=1;
	for(i=1;i<cnt;i++){
		if(t[i].score==t[i-1].score){
			t[i].frank=t[i-1].frank;
		}
		else{
			t[i].frank=i+1;	
		}
	}
	printf("%d\n",cnt);
	for(i=0;i<cnt;i++){
		printf("%s %d %d %d\n",t[i].id,t[i].frank,t[i].lnum,t[i].lrank);
	}
	return 0;
}

 

抱歉!评论已关闭.