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

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是总评相同时,要以学号升序排序,出错说明你学号的排序方式那出错了

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog