杭电2023 求平均成绩(及一些易见的错误)

  链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2023

  首先,想说下,这题对我来说可能是一个阴影。因为在自己学校的程序竞赛中,这是第二题,当时自己没ac,结果那叫一个自卑啊!然后今天a题目的时候那种恐惧感又来了,很影响情绪。然后,自己现在完全通过自己的努力,但也用了起码3小时的纠错时间,将代码ac了。附上ac代码:

#include <iostream>
#include<math.h>
#include <iomanip>
#include<cstdio>
#include<string>
#include<map>
#include<vector>
#include<list>
#include<algorithm>
#include<stdlib.h>
#include<iterator>
using namespace std;


int main()
{

    int m,n;
    double sum=0;
    double sum2=0;
    int cnt=0;
    int cnt2=0;

    while(cin>>n>>m)
    {
        int biger=0;
         int biger2=0;
        int *p=new int[m*n];//开辟内存空间因为不知道有多少MM
        double *average=new double[m];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>p[i*m+j];//画个图你就可以知道这是用一维数组表示二维数组

            }
        }

        for(int i1=0;i1<n;i1++)//求每个人的平均成绩 所以是/课程数目
        {
            for(int j1=0;j1<m;j1++)
            {
                sum=sum+p[i1*m+j1];
                if((i1*m+j1+1)%m==0)//算完一个人输出一次
                {
                    if(i1*m+j1<m*n-1)
                    {
                         cout<<fixed<<setprecision(2)<<sum/m<<" ";
                    }
                   else
                   {
                       cout<<fixed<<setprecision(2)<<sum/m<<endl;
                   }

                    sum=0;
                }
            }
        }

        for(int j2=0;j2<m;j2++)//求每门课的平均成绩
        {
            for(int i2=0;i2<n;i2++)
            {
                sum2=sum2+p[i2*m+j2];
                cnt++;
                if(cnt==n)//因为是 每一门课 所以是按人来计算的 所以是n
                {
                     if(i2*m+j2<m*n-1)
                    {
                         cout<<fixed<<setprecision(2)<<sum2/n<<" ";
                         average[cnt2]=sum2/n;
                         cnt2++;//每次向后移动为下次作准备
                    }
                   else
                   {
                       cout<<fixed<<setprecision(2)<<sum2/n<<endl;
                       average[cnt2]=sum2/n;
                        cnt2=0;//最后一次不用向后移而是重新初始化;
                   }
                    cnt=0;
                    sum2=0;
                }
            }
        }
/*
        for(int ck=0;ck<m;ck++){
            cout<<average[ck]<<"  ";
        }*/

        for(int ii=0;ii<n;ii++)
        {   biger=0;//big 的每次初始化必须在这边 不然的话若在if中就会出现 
        //big加上去了 但因为没有符合bigger 条件的 然后 就会出现问题。
            for(int jj=0;jj<m;jj++)
            {
                if(p[ii*m+jj]>=average[jj])
                {
                    biger++;
                }

            }
            if(biger==m){
                biger2++;

            }

        }
        cout<<biger2<<endl;
        cout<<endl;
        delete []p;
        delete []average;
     }

    return 0;
}

易见问题:

1.average数据类型的定义 double ;//float 会出现问题

2.求人的平均成绩的时候是除科目数目,累加的时候是按照科目数为断点;

3.求科目平均成绩的时候除的是人的数目,累加的时候是以人数为断电;

4.我用的是双重循环,所以两个求平均数就是内外反一下。

然后 用空间换时间,一重循环的代码:

摘自:http://blog.csdn.net/always2015/article/details/45501859

#include <iostream>
#include"string.h"
#include<iomanip>
using namespace std;

int main(void)
{
    int n,m,*flag,person_num=0;
    //必须使用double类型,否则通不过
    double *input_score,*indi_aver_score,*subject_aver_score,*indi_total_score,*subject_total_score;
    while(cin>>n>>m)
    {
        flag=new int[n];
        input_score=new double[n*m];
        //为个人平均成绩和课程平均成绩分配空间
        indi_aver_score=new double[n];
        subject_aver_score=new double[m];
        //为个人总分和每门课程成绩总分分配空间
        indi_total_score=new double[n];
        subject_total_score=new double[m];
        //对个人总分,每门课程成绩总分分配空间,flag用来判断每个人各科成绩均大于等于平均成绩的次数
        memset(flag,0,n*sizeof(int));
        memset(indi_total_score,0,n*sizeof(double));
        memset(subject_total_score,0,m*sizeof(double));

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                //输入每人的各科成绩,并统计每个人总分数,和各门课程总分数
                cin>>input_score[i*m+j];
                indi_total_score[i]+=input_score[i*m+j];
                subject_total_score[j]+=input_score[i*m+j];
            }

        }

        for(int k=0; k<n; k++)
        {
            //求出每个人的平均成绩,注意这里除的是课程数m,而不是人数n
            indi_aver_score[k]=indi_total_score[k]/m;
            //格式输出个人平均成绩
            if(k==n-1)
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<indi_aver_score[k]<<endl;
            else
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<indi_aver_score[k]<<" ";
        }

        for(int h=0; h<m; h++)
        {
            //求出每门课的平均成绩,注意这里除的是人数n,而不是课程数m
            subject_aver_score[h]=subject_total_score[h]/n;
            //格式输出每门课成绩
            if(h==m-1)
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<subject_aver_score[h]<<endl;
            else
                cout<<setiosflags(ios::fixed)<<setprecision(2)<<subject_aver_score[h]<<" ";
        }

        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                //判断每人各科成绩均是否大于等于平均成绩,true的话就在每人对应的flag上加1
                if(input_score[i*m+j]>=subject_aver_score[j])
                {
                    ++flag[i];
                }


            }

        }

        for(int k=0; k<n; k++)
        {
            //如果每人对应的flag都等于课程数,即每个人的每门课都大于等于平均数,则符合要求
            if(flag[k]==m)
                ++person_num;

        }
        //格式输出每门课都大于等于平均数的人数
        cout << person_num <<endl<< endl;
       //释放空间
        delete input_score;
        delete indi_aver_score;
        delete indi_total_score;
        delete subject_aver_score;
        delete subject_total_score;
        delete flag;
        //清零
        person_num=0;

    }
    return 0;
}

心情大好~

原文地址:https://www.cnblogs.com/William-xh/p/6832511.html