征程万里 2018-10-25 09:57 采纳率: 0%
浏览 1432

pta1080期末成绩 第四个测试点无法通过(c语言)

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void*a,const void*b);
int compare(const void*a,const void*b);
struct xinxi{
        char a[21];
        int b;
        int c;
        int d; 
        int e;
    };
int main(){
    int p,mid,final;
    scanf("%d %d %d",&p,&mid,&final);
    int i=0;
    struct xinxi student[30000];
    for(i=0;i<30000;i++){
        student[i].b=0;
        student[i].c=0;
        student[i].d=0;
    }
    int cnt=0;
    i=0;
    char n[21];
    int m=0;
    while(i<p){
        scanf("%s %d",n,&m);
        if(m>=200){student[cnt].b=m;
        strcpy(student[cnt++].a,n);}
        i++;}
    i=0;
    int t=0;
    int flag=0;
    while(i<mid){
        scanf("%s %d",n,&m);
        student[cnt].c=m;
     strcpy(student[cnt++].a,n);
        i++;
    }
    i=0;
    while(i<final){
        scanf("%s %d",n,&m);
        student[cnt].d=m;
        strcpy(student[cnt++].a,n);
        i++;
    }
    qsort(student,cnt,sizeof(struct xinxi),compare);//收集完所有数据后,按学号升序排列,那么相同学号的就会排列到一起。
    int cnt2=0;struct xinxi s[cnt];
    for(i=0;i<cnt;i++){//判断前后结构体中的学号是否相同,相同则叠加(最多叠加3个),然后跳到下一个新的结构体
        s[cnt2]=student[i];
        if(i+1<cnt&&strcmp(student[i].a,student[i+1].a)==0){
            s[cnt2].b+=student[i+1].b;
            s[cnt2].c+=student[i+1].c;
            s[cnt2].d+=student[i+1].d;
            if(i+2<cnt&&strcmp(student[i+1].a,student[i+2].a)==0){
            s[cnt2].b+=student[i+2].b;
            s[cnt2].c+=student[i+2].c;
            s[cnt2].d+=student[i+2].d;
            i++;
            }
            i++;
        }
        cnt2++;
    }
    int n1=0;struct xinxi s2[cnt2];
    for(i=0;i<cnt2;i++){
        if(s[i].c>s[i].d){
            s[i].e=0.4*s[i].c+0.6*s[i].d+0.5;
        }else{
            s[i].e=s[i].d;
        }
        if(s[i].c==0){s[i].c=-1;}
        if(s[i].b>=200&&s[i].e>=60){
            s2[n1++]=s[i];
        }
    }
    qsort(s2,n1,sizeof(struct xinxi),cmp);
    for(i=0;i<n1;i++){
        printf("%s %d %d %d %d\n",s2[i].a,s2[i].b,s2[i].c,s2[i].d,s2[i].e);
    }
    return 0;
}
int cmp(const void*a,const void*b){
    if(((const struct xinxi*)b)->e-((const struct xinxi*)a)->e){
        return ((const struct xinxi*)b)->e-((const struct xinxi*)a)->e;
    }
    return strcmp(((const struct xinxi*)a)->a,((const struct xinxi*)b)->a);
}
int compare(const void*a,const void*b){
    return strcmp(((const struct xinxi*)a)->a,((const struct xinxi*)b)->a);
}

对第四个测试点来说,并没有超时,显示答案错误。我搜索了网上其他人的做法,他们用了bsearch做查找,我试过了也通过了。但是,总是很疑惑我的方法到底错在哪里,反复检查我的代码,找不出问题所在,因此想请教各位编程大神。
ps:代码略长,不过关键就在于注释部分。

  • 写回答

2条回答 默认 最新

  • Italink 2018-10-25 10:44
    关注

    测试点3是总评相同时,要以学号升序排序,出错说明你学号的排序方式那出错了

    评论

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境