杭电2023 求平均成绩

题意不多说。代码已经写出,用的最笨的方法但不幸的是超时了。Runtime Error。
先把代码放这,然后再思考新算法。

#include<stdio.h>
double a[52][6],c[6];
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n) != EOF)
    {
        int i,j;
        double stud1;
        for(j = 0;j < n; j++)
            for(i = 0;i < m; i++)
            scanf("%lf",&a[j][i]);
        for(j = 0;j < n; j++)
        {
            stud1 = 0;   //记录每个人的总成绩
            for(i = 0;i < m;i ++)
                stud1 += a[j][i];
            if(j == 0)
                printf("%.2lf",stud1/m);
            if(j)
                printf(" %.2lf",stud1/m);
        }
        printf("\n");
        for(i = 0;i < m; i++)
        {
            double stud2 = 0;   //记录每个课程的总成绩
            for(j = 0;j < n; j++)
                stud2 += a[j][i];
            c[i] = stud2/n;     //记录每个课程平均成绩
        }
        int good = 0;           //标记每一课成绩大于平均成绩
        for(j = 0;j < n; j++)
        {
            int t = 1;          //t仅仅在这个语句有作用
            for(i = 0;i < m; i++)
                if(a[j][i] < c[i]) t = 0;
            if(t) good ++;
        }
        printf("%.2lf",c[0]);
        for(int i = 1;i < m; i++)
            printf(" %.2lf",c[i]);
        printf("\n");
        if(good)printf("%d\n",good);
    }
    return 0;
}

今天找到错误了。
初学者不要怀疑是不是系统的问题。就像昨天我以为是二维数组和printf函数比较花时间所以超时了,但是仔细一看是ACCESS_VIOLATION,意思就是程序不严谨。最初我找到了上边的代码m,n的位置错了,提交结果WA。我也比较无奈,但是总算知道是程序的问题了,然后仔细排查。终于找到是good的问题。
且看代码。

#include<stdio.h>
double a[55][10],b[55],c[10];
int main()
{
    int m,n;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        int i,j;
        double stud1;
        for(j = 0; j < n; j++)
            for(i = 0; i < m; i++)
                scanf("%lf",&a[j][i]);
        for(j = 0; j < n; j++)
        {
            stud1 = 0;   //记录每个人的总成绩
            for(i = 0; i < m; i ++)
                stud1 += a[j][i];
            b[j] = stud1/m;
        }
        for(i = 0; i < m; i++)
        {
            double stud2 = 0;   //记录每个课程的总成绩
            for(j = 0; j < n; j++)
                stud2 += a[j][i];
            c[i] = stud2/n;     //记录每个课程平均成绩
        }
        int good = 0;           //标记每一课成绩大于平均成绩
        for(j = 0; j < n; j++)
        {
            int t = 1;          //t仅仅在这个语句有作用
            for(i = 0; i < m; i++)
                if(a[j][i] < c[i])
                {
                    t = 0;
                    break;
                }
            if(t)
                good ++;
        }
        printf("%.2lf",b[0]);
        for(i = 1; i < n; i ++)
            printf(" %.2lf",b[i]);
        printf("\n");
        printf("%.2lf",c[0]);
        for(int i = 1; i < m; i++)
            printf(" %.2lf",c[i]);
        printf("\n");
            printf("%d\n",good);
        printf("\n");
    }
    return 0;
}

最终还是要说一句。
在这个复杂又浮躁的世界,只有自己保持一颗安静的心灵方能积少成多。

你可能感兴趣的:(杭电)