杭电2023 求平均成绩(及一些易见的错误)
Posted William_xh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杭电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; }
心情大好~
以上是关于杭电2023 求平均成绩(及一些易见的错误)的主要内容,如果未能解决你的问题,请参考以下文章