PAT A1025 Ranking 【排序】25

解题思路

1 用结构体Testee记录学生的信息:分数、考场、考号、考场排名、总排名
2 每个考场学生录入结束后,对考场内考生排名,并设置名次
3 所有考场学生录入结束后,对所有考场内考生排名,并设置名次
4 排序规则:按照名次非递减(即按照分数非递增),同名次(即同分数)的考生,按照考号非递减排序

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Testee {
	string id;
	int lid; //考场号 
	int sc; //分数
	int rkl; //本地排名
	int rka; //总排名
};
bool cmp(Testee &t1,Testee &t2) {
	if(t1.sc!=t2.sc)return t1.sc>t2.sc;
	else return t1.id<t2.id;
}
void setrkl(vector<Testee>&ts) {
	ts[0].rkl=1;
	int k = ts.size();
	for(int i=1; i<k; i++) {
		ts[i].rkl=i+1;
		if(ts[i].sc==ts[i-1].sc) {
			ts[i].rkl=ts[i-1].rkl;
		}
	}
}
void setrkall(vector<Testee>&ts) {
	ts[0].rka=1;
	int k = ts.size();
	for(int i=1; i<k; i++) {
		ts[i].rka=i+1;
		if(ts[i].sc==ts[i-1].sc) {
			ts[i].rka=ts[i-1].rka;
		}
	}
}
int main() {
	int n,k;
	scanf("%d",&n);
	Testee t;
	vector<Testee> vts; //本地考生信息
	vector<Testee> vtsall; //全部考生信息
	for(int i=1; i<=n; i++) {
		scanf("%d",&k);
		vts.clear();
		vts.resize(k);
		for(int j=0; j<k; j++) {
			cin>>vts[j].id>>vts[j].sc;
			vts[j].lid=i; //考场号 
//			vtsall.push_back(vts[j]); //加入总榜
		}
		sort(vts.begin(),vts.end(),cmp); //本地排名
		setrkl(vts);
		vtsall.insert(vtsall.end(),vts.begin(),vts.end());
	}
	sort(vtsall.begin(),vtsall.end(),cmp); //总榜排名
	setrkall(vtsall);
	printf("%d
",vtsall.size());
	for(int i=0;i<vtsall.size();i++){
		Testee t = vtsall[i];
		printf("%s %d %d %d
",t.id.c_str(),t.rka,t.lid,t.rkl); 
	}
	return 0;
}
原文地址:https://www.cnblogs.com/houzm/p/14408536.html