算法初步-排序及部分习题 PAT Ranking

题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872

//PAT A1025
#include <stdio.h>
#include <algorithm> 
#include <string.h>
using namespace std;		//sort函数 
struct StuInfo{
	char stuID[15];				//注册编号 
	int score;				//分数 
	int local_rank;			//本地排名 
	int final_rank;			//总排名 
	int loc_number;			//地区编号 
};

bool cmp(StuInfo a,StuInfo b){
	if(a.score!=b.score) return a.score>b.score;		//按分数从大到小排序 
	else return strcmp(a.stuID,b.stuID)<0;				//分数相同,按准考证号从小到大排序 
}

int main(){
	int n;//地区数
	int k;//各地区人数
	int num=0;//总人数 
	scanf("%d",&n);
	StuInfo ranklist[30010];
	for(int i=1;i<=n;i++){
		scanf("%d",&k);
		for(int j=1;j<=k;j++){
			ranklist[num].loc_number=i;
			scanf("%s %d",ranklist[num].stuID,&ranklist[num].score);
			num++;
		}
		sort(ranklist+num-k,ranklist+num,cmp);
		ranklist[num-k].local_rank=1;
		int rank=1,exnum=1;		//exnum为同排名人数 
		for(int i=1;i<k;i++){
			if(ranklist[num-k+i].score==ranklist[num-k+i-1].score)
			{
				ranklist[num-k+i].local_rank=rank;
				exnum++;
			}
			else{
				rank+=exnum;
				ranklist[num-k+i].local_rank=rank;
				exnum=1;
			}
		} 
	} 
	sort(ranklist,ranklist+num,cmp);
	printf("%d\n",num);
	ranklist[0].final_rank=1;
	int exnum=1,rank=1;
	printf("%s %d %d %d\n",ranklist[0].stuID,ranklist[0].final_rank,ranklist[0].loc_number,ranklist[0].local_rank);
	for (int i=1;i<num;i++){
		if(ranklist[i].score==ranklist[i-1].score){
			ranklist[i].final_rank=rank;
			exnum++;
		}
		else{
			rank+=exnum;
			ranklist[i].final_rank=rank;
			exnum=1;
		}
		printf("%s %d %d %d\n",ranklist[i].stuID,ranklist[i].final_rank,ranklist[i].loc_number,ranklist[i].local_rank);
	}
	
	return 0;
}

习题及代码:https://github.com/CapricornHearth/algorithm/tree/master/%E6%8E%92%E5%BA%8F

猜你喜欢

转载自blog.csdn.net/Capricorn_devil/article/details/86583295