错误分析:没有仔细阅读题目,导致输出的结果各个参数的顺序不对,导致pat的报错原因。
收获;要熟读题目不能将计算机想象成人一样具有能自动识别的能力。
错误原因 将printf("%d %d %d\n",r,stu[i].local_number,stu[i].local_rank);中的stu[i].local_number和stu[i].local_rank的位置上搞反了,改为printf("%d %d %d\n",r,stu[i].local_number,stu[i].local_rank);后问题解决。
//需求分析:首先定义一个学生机构体,这个结构体里包括准考证号、考场号、成绩、总成绩排名,考场成绩排名
//编写一个对比函数cmp对比两学生的成绩,如果成绩一样则让准考证号小的在上边
//按照考场输入考生成绩以及信息,每个考场排序一次。将须有考场循环一遍
//最后用sort函数排序所有的考生成绩
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct student
{
char id[15];
int score;
int local_rank;
int local_number;
}stu[30010];
bool cmp(student a,student b)
{
if (a.score!=b.score) return a.score>b.score;
else return strcmp(a.id,b.id)<0;
}
int main()
{ int n,k,num=0;
scanf("%d",&n);//考场数
for (int i = 1; i <= n; i++)
{
scanf("%d",&k);
for (int j = 0; j < k; j++)
{
scanf("%s %d",stu[num].id,&stu[num].score);
stu[num].local_number=i;
num++;
}
sort(stu+num-k,stu+num,cmp);
stu[num-k].local_rank=1;
for (int x= num-k+1; x < num; x++)//让该考场的第二位到最后一位分数相同者拥有相同的考场排名,
{
if (stu[x].score==stu[x-1].score)
{
stu[x].local_rank=stu[x-1].local_rank;
}
else
{
stu[x].local_rank=x+1-(num-k);
}
}
}
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].id);
printf("%d %d %d\n",r,stu[i].local_number,stu[i].local_rank);
}
return 0;
}
解决问题时参考的网站https://blog.csdn.net/pihe7623/article/details/79679264