题目链接: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;
}