杭电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;
}

心情大好~

时间: 2024-12-29 06:51:26

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

hdu 2023 求平均成绩 (java)

问题: 在计算列和时,没有将i j调换,导致输出错误的结果: for(int i=0;i<m;i++) { for(int j=0;j<n;j++) g[i]+=a[j][i];//错误:g[i]+=a[i][j]; g[i]=g[i]/n; 此外,定义了三个double型数组导致超出内存,实际上二维数组只需要用int型: 最后输出时没有注意要预留一个空行: 如果在同一级出现相同的for循环,要看能否组合成一个循环: 求平均成绩 Time Limit: 2000/1000 MS (Java/O

hdoj 2023 求平均成绩

求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 74055    Accepted Submission(s): 17809 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. Input

hdu 2023 求平均成绩

本题链接:点击打开链接 本题题意: 有n名学生,m门课程,输入每个学生没门课程的成绩,求每个学生的平均成绩和没门课程的平均成绩,并统计每门课程的成绩均超过该课程平均成绩的学生有多少名. 解题思路: 本题主要是使用三个数组,一个score二维数组存放每个学生每门课的成绩,然后两个一维数组student和subject分别存放每个学生的平均成绩及每门课的平均成绩.具体请参考代码: #include<stdio.h> #include<string.h> double student[5

2023.求平均成绩

#include<stdio.h> #include<string.h> double student[55],subject[9],sore[55][9]; int main(){          int m,n;          while(scanf("%d%d",&m,&n)!=EOF){                    for(int i=0;i<n;i++)                       for(int

HDU2023求平均成绩 - biaobiao88

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2023 求平均成绩 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. Input 输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数.然后是n行数据,每行包括m个整数(即:考试分数). Output 对于每个测试实例,输出3行数

求平均成绩(杭电2023)(确实很水很繁琐)

求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 66221    Accepted Submission(s): 15805 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. Input

求平均成绩 【杭电-HDOJ-2023】 附题+详解

/* 求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 62086    Accepted Submission(s): 14888 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. In

杭电2023 平均成绩

求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 103993    Accepted Submission(s): 24170 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. Input

求平均成绩

Problem B: 求平均成绩 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 43  Solved: 6 [Submit][Status][Web Board] [Edit] [TestData] Description 班上有学生若干名,已知每名学生的成绩(整数),求班上全部学生的平均成绩.保留到小数点后两位.同一时候输出该平均成绩整数部分四舍五入后的数值. 第一行有一个整数n(1<= n <= 100),表示学生的人数.其后n行每行有1个