#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct student{
char name[20];
int score;
int b;
int px1;
}stu[30010];
bool cmp(student p1,student p2)
{
if(p1.score!=p2.score)
return p1.score>p2.score;
else
return strcmp(p1.name,p2.name)<0;
}
int main()
{
int m;
int num=0;
scanf("%d",&m);
int k;
for(int j=1;j<=m;j++)
{
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%s %d",stu[num].name,&stu[num].score);
stu[num].b=j;
num++;
}
sort(stu+num-k,stu+num,cmp);
stu[num-k].px1=1;
for(int j=num-k+1;j<num;j++)
{
if(stu[j].score==stu[j-1].score)
{
stu[j].px1=stu[j-1].px1;
}
else
stu[j].px1=j+1-(num-k);
}
}
//sort(stu,t,px);
printf("%d\n",num);
sort(stu,stu+num,cmp);
int r=1;
for(int i=0;i<num;i++)
{
if(i>0&&stu[i].score!=stu[i-1].score)
r=i+1;
printf("%s ",stu[i].name);
printf("%d %d %d\n",r,stu[i].b,stu[i].px1);
}
return 0;
}
一开始卡住的点是
不知道如何存储
也就是一个数组 既要输出队内排序 也要输出整个排序
数组的下标不知道如何表示
其实num++ num-k 可以解决
还有一个问题
输出顺序
讲道理是按照成绩的总排名来排的
但是成绩一样 就只能按id号来排
id的存储用的是char类型的字符数组
所以cmp函数中不能直接return比较
所以要用strcmp函数(一般用来比较字符数组的字典序)
最后值得注意的是
输出最终排名时r的判断
成绩不等 直接顺序
相等直接上一个
所以从0开始