考察结构体排序以及合并操作
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std;
typedef struct Node
{
string registrition_number;
int grade;
int location_number;
int local_rank;
int final_rank;
bool operator>(const Node& orh) const
{
if(grade != orh.grade)
return grade>orh.grade;
else return registrition_number<orh.registrition_number;
}
}Node;
int main()
{
int n;
scanf("%d",&n);
vector<Node> globalList;
for(int l = 0; l < n; ++l)
{
int k;
scanf("%d",&k);
vector<Node> localList(k);
for(int i = 0; i < k; ++i)
{
cin>>localList[i].registrition_number;
scanf("%d",&localList[i].grade);
localList[i].location_number = l;
//globalList.push_back(localList[i]);
}
//sort
sort(localList.begin(), localList.end(), greater<Node>());
//process the same grade with the same rank
int nowGrade = -1;
int nowRank = -1;
for(int i = 0; i < k; ++i)
{
if(localList[i].grade == nowGrade)
localList[i].local_rank = nowRank;
else
{
nowGrade = localList[i].grade;
nowRank = i;
localList[i].local_rank = i;
}
globalList.push_back(localList[i]);
}
}
//sort the global list
//sort
sort(globalList.begin(), globalList.end(), greater<Node>());
//process the same grade with the same rank
int nowGrade = -1;
int nowRank = -1;
for(int i = 0; i < globalList.size(); ++i)
{
if(globalList[i].grade == nowGrade)
globalList[i].final_rank = nowRank;
else
{
nowGrade = globalList[i].grade;
nowRank = i;
globalList[i].final_rank = i;
}
}
//output
printf("%d\n", globalList.size());
for(int i = 0; i < globalList.size(); ++i)
{
cout<<globalList[i].registrition_number;
printf(" %d %d %d\n", globalList[i].final_rank+1, globalList[i].location_number+1, globalList[i].local_rank+1);
}
return 0;
}