PTA(甲级)1025(水题)

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

题目大意:有n个考场,每个考场有若干名学生。给出各个考场学生的准考证号,分数,要求将所有考生按分数从高到低排序,并按顺序输出所有考生的准考证号,排名,考场号和考场内排名

分析:一个结构体,可以记录场内排名,总排名;先场内排序,记录场内排名;然后再排总排名。

(一开始自己想用 long long 保存准考证号,一直不对。仔细一想,准考证号一定是13位,可以有前置0。用long long 那么输出必须用%013lld)

#include<iostream>
#include<cstdio>
using namespace std;
#include<algorithm>
#include<cmath>
#include<set> 
#include<map>
#include<string> 
#include<cstring>
#include<vector>
#include<cstdlib> 
#define ll long long int 
const double eps=1e-8;
struct student
{
	int kc;
	char num[15];
	int score;
	int pm1,pm2;
}stu[30005];
struct rule
{
	bool operator()(const student &a1,const student & a2){
		if(a1.score==a2.score)	return strcmp(a1.num,a2.num)<0;
		else 	return a1.score>a2.score;
	}
};
int main()
{
	int n;
	cin>>n;
	int sumnum=0,a;
	for(int j=1;j<=n;j++){
		cin>>a;
			for(int i=0;i<a;i++){
				cin>>stu[sumnum].num>>stu[sumnum].score;
				stu[sumnum].kc=j;
				sumnum++;
			}
			sort(stu+sumnum-a,stu+sumnum,rule());    //注意这里的排序范围
			stu[sumnum-a].pm1=1;
			for(int i=sumnum-a+1;i<sumnum;i++){
				if(stu[i].score==stu[i-1].score)
					stu[i].pm1=stu[i-1].pm1;
				else
					stu[i].pm1=i+1-(sumnum-a);
			}
		
	}
	sort(stu,stu+sumnum,rule());
	stu[0].pm2=1;
	for(int i=1;i<sumnum;i++){
		if(stu[i].score==stu[i-1].score)
			stu[i].pm2=stu[i-1].pm2;
		else 
			stu[i].pm2=i+1; 
		}
	printf("%d\n",sumnum);
	int r=1;
	for(int i=0;i<sumnum;i++){
		printf("%s %d %d %d\n",stu[i].num,stu[i].pm2,stu[i].kc,stu[i].pm1);
		}	return 0;
 } 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值