zoukankan      html  css  js  c++  java
  • 杭电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;
    }

    心情大好~

  • 相关阅读:
    五种方法实现python3-随机生成10位包含数字和字母的密码
    用matplotlib中imshow()函数绘图
    MTNET 自用ios网络库开源
    移动时代软件测试团队该往哪里去?
    自己做的加速app测试流程的小工具,目前打算开放使用,想注册的朋友抓紧了,嘻嘻
    golang append
    Invalid Image Path
    xcode 插件之KSImageNamed-Xcode
    dissmiss a UISearchBar with an SearchBarController
    nginx server_name
  • 原文地址:https://www.cnblogs.com/William-xh/p/6832511.html
Copyright © 2011-2022 走看看