测试点分析:是否全部是以char数组的形式存储学号?若用long long int存储,可能遇到学号前面几个数字为0的时候被默认舍弃,这是得控制输入格式。
输入:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
输出:
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
出现段错误,解决办法,将代码从
bool cmp(Student s1, Student s2){
if(s1.score != s2.score){
return s1.score>s2.score;
}else{
return s1.id<s2.id;
}
}
改为
bool cmp(Student s1, Student s2){
if(s1.score != s2.score){
return s1.score>s2.score;
}else{
return strcmp(s1.id,s2.id)<0;
}
}
当然,记得要#include<string.h>,使用strcmp函数
贴个完整代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int maxn = 30010;
using namespace std;
struct peo{
char xh[15]; //学号
int sco; //成绩
int wr; //全局排名
int lr; //考场排名
int lo; //考场号
}p[maxn];
bool cmp(peo p1, peo p2){
if(p1.sco!=p2.sco){
return p1.sco>p2.sco; //成绩不一致时,按成绩排序
}else{
return strcmp(p1.xh,p2.xh)<0; //成绩一致时,按学号升序排序
}
}
int main(){
int lo_num; //考场个数
scanf("%d",&lo_num);
int sum = 0;
int local = 1;
for(int i=0;i<lo_num;i++){
int num; //本考场人数
scanf("%d",&num);
for(int j=sum;j<num+sum;j++){
scanf("%s %d",&p[j].xh,&p[j].sco);
p[j].lo = local;
}
local++;
sort(p+sum,p+sum+num,cmp);
int rank = 1;
for(int j=sum;j<num+sum;j++){
p[j].lr = rank++;
if(j>sum&&p[j].sco==p[j-1].sco){ //考虑分数相同的情况
p[j].lr = p[j-1].lr;
}
}
sum += num;
}
sort(p,p+sum,cmp);
int rank = 1;
for(int j=0;j<sum;j++){
p[j].wr = rank++;
if(j>0&&p[j].sco==p[j-1].sco){ //考虑分数相同的情况
p[j].wr=p[j-1].wr;
}
}
printf("%d\n",sum);
for(int i=0;i<sum;i++){
printf("%s %d %d %d",p[i].xh,p[i].wr,p[i].lo,p[i].lr);
if(i<sum-1) printf("\n");
}
return 0;
}

本文介绍了一个关于学生信息排序的问题,特别是针对学号前导零的问题,使用字符数组而非整型变量来存储学号,并通过修改比较函数解决了段错误问题。提供了完整的代码示例。
221

被折叠的 条评论
为什么被折叠?



