其他分享
首页 > 其他分享> > PAT 甲级1025 PAT ranking

PAT 甲级1025 PAT ranking

作者:互联网

题意:第一个数是说有多少个考场(从1开始算),第二个数是第一个考场有多少个人,然后就是考生的学号和成绩,输完以后再输下一个考场的人数和学号成绩,知道输完所有考场,我们要的是给这些学生排名,如果成绩相同就用学号从小到大排,如果成绩不同就用成绩从大到小排,我们要排的排名有考场的排名和最后所有考生的排名,还要记录该学生的考场号;

思路:一个个考场的人用sort先比完然后就放到动态数组vector里面,最后再对动态数组vector用sort整理输出就得了,考场内自己比,最后合起来一起比;

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct student {
	long long int num;
	int roomrank;
	int rank;
	int score;
	int room;
};
bool cmp(student a,student b) {
	return (a.score==b.score)?(a.num<b.num):(a.score>b.score);//比较函数,相同就比学号从小到大,不同就比成绩,从大到小,真就执行第一条,假就执行第二天;
}
int main() {
	int n,m;
	cin>>n;
	vector<student> v2;//全局定义v2所以要在外面定义;
	for(int i=1; i<=n; i++) {//考场号,分考场录入,从1号考场开始;
		cin>>m;
		vector<student> v(m);
		for(int j=0; j<m; j++) {
			cin>>v[j].num>>v[j].score;//录入成绩和学号;
			v[j].room=i;//录入考场号;
		}
		sort(v.begin(),v.end(),cmp);
		v[0].roomrank=1;
		v2.push_back(v[0]);//后面和前面比,所以先把第一个录进来(第一个肯定是第一名)
		for(int k=1; k<m; k++) {//排考场排名
			v[k].roomrank=(v[k].score==v[k-1].score)?(v[k-1].roomrank):(k+1);
			v2.push_back(v[k]);
		}

	}
	sort(v2.begin(), v2.end(), cmp);//全部搞定比,各个考场完录入到v2,再总的排序一次;
	v2[0].rank=1;
	for(int i=1; i<v2.size(); i++) {
		v2[i].rank=(v2[i].score!=v2[i-1].score)?(i+1):(v2[i-1].rank);
	}
	cout<<v2.size()<<endl;
	for(int i=0; i<v2.size(); i++) {
		printf("%013lld %d %d %d\n",v2[i].num,v2[i].rank,v2[i].room,v2[i].roomrank);
	}
	return 0;
}

标签:1025,ranking,vector,PAT,int,考场,score,include,成绩
来源: https://blog.csdn.net/m0_51711089/article/details/121496087