PAT A1025-----算法笔记

题目:
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhejiang University. Each test is supposed to run simultaneously in several places, and the ranklists will be merged immediately after the test. Now it is your job to write a program to correctly merge all the ranklists and generate the final rank.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive number N (≤100), the number of test locations. Then N ranklists follow, each starts with a line containing a positive integer K (≤300), the number of testees, and then K lines containing the registration number (a 13-digit number) and the total score of each testee. All the numbers in a line are separated by a space.
Output Specification:For each test case, first print in one line the total number of testees. Then print the final ranklist in the following format:
registration_number final_rank location_number local_rank
The locations are numbered from 1 to N. The output must be sorted in nondecreasing order of the final ranks. The testees with the same score must have the same rank, and the output must be sorted in nondecreasing order of their registration numbers.
Sample Input:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
Sample Output:
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

题目大意:有n个考场,每个考场有若干数量的考生。现在给出各个考场中考生的准考证号与分数,要求将所有考生按照分数从低到高排列顺序,并按输出*所有考生的准考证号,排名,考场号和考场内排名(最后一个是在一个考场中的排名,前面三个是针对所有考生的

代码实现:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

struct Student{
	char id[15];//准考证号 
	int socre;//分数 
	int location_number;//考场号 
	int local_rank;//考场内排名 
}stu[30010]; 
//------------------------------------------------------------------------------------
bool cmp(Student a,Student b){
	//按分数从高到底排序
	if(a.socre!=b.socre){
		return a.socre>b.socre;
	} else{
		//分数相同按准考证从小到大排序
		return strcmp(a.id,b.id)<0;//说明a的id小于b的id 
	}
}
//-----------------------------------------------------------------------------------------
int main(){
	int n,k,num=0; //num为总考生数,n为有几个考场,k为该考场人数 
	scanf("%d",&n);//n为考场数 
	//下面输入2个考场的id和score
	for(int i=1;i<=n;i++){//遍历考场,从1开始,不能没有一个考场吧 
		//遍历每一个考场的考生的id和score
		scanf("%d",&k);//输入每一个2考场的人数 
		for(int j=0;j<k;j++){
			//输入考生信息
			scanf("%s %d",&stu[num].id,&stu[num].socre);
			stu[num].location_number=i; 
			num++;//总考生数加1 
		} 
	
//---------------------------------------要对每个考场考生进行排序,因为最后要输出考场内排名------------------------------------------------------------ 
	//将该考场的考生排序,输入了2个考场的考生
	//假设这个考场共k个考生,总人数为num,把考生信息存在数组中,数组下标的区间就是[num-k,num) 
	//排序直接用sort函数
	sort(stu+num-k,stu+num,cmp);
	//把该考场的第一个排名为1
	stu[num-k].local_rank=1;
	//除了第一个,对其余考生进行排序
	for(int j=num-k+1;j<num;j++){//不能等于num,因为取不到 
//---------------------------------------------------------------------------------------------------
	//如果同分 
		if(stu[j].socre==stu[j-1].socre){
			stu[j].local_rank=stu[j-1].local_rank;
		} else{
	//如果不同分,那么该位考生前面有多少人呢,注意考生排名和存考生信息数组下标之间差了1,
	//那么计算考生排名的时候j要加1再减去第一名的local_rank,才是该考生的local_rank,因为j是考生信息的数组下标 
			 stu[j].local_rank=j+1-(num-k);//该考生的排名减去第一个考生的排名就是他前面有多少人
			 
		}
	} 
}
//----------------------------二个考场所有考生一起排序,输出准考证号,排名,考场号,和考场内排名---------------------------------------------
    printf("%d\n",num);//输出考生总人数
	sort(stu,stu+num,cmp);//将所有考生排序
	int r=1;//当前考生的排名
	for(int i=0;i<num;i++){
		if(i>0&&stu[i].socre!=stu[i-1].socre){
			r=i+1;//考生排名加1 
		}
		
		printf("%s %d %d %d\n",stu[i].id,r,stu[i].location_number,stu[i].local_rank); 
	} 
		
	
}






运行结果:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值