1581: 统计成绩
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 820 Solved: 154
[Submit][Status][Web Board]
Description
假设一个班有n(n<=50)个学生,每人考m(m<=50)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。
Input
输入数据有多个测试实例,每个测试实例的第一行包括两个整数n和m,分别表示学生数和课程数。然后是n行数据,每行包括m个整数(即:考试分数)。
Output
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。
每个测试实例后面跟一个空行。
Sample Input
2 2 5 10 10 20
Sample Output
7.50 15.00 7.50 15.00 1
HINT
Source
通过sample input以及sample output会发现,这道题的sample数据十分具有迷惑性。不用它的数据,自己造。(我造的数据是3 2 5 10 10 20 5 10,不然出现wa了用这种数据测试根本无法快速准确发现不了问题)
正因为sample数据的迷惑性,我们需要认真读懂题,理解清楚。其实不难发现,上过学都知道老师这样统计成绩都是常规操作。并且,都是用excel表格完成的。
我们可以利用excel表格来理解这道题。所以自然联想二维数组。
上ac代码。
#include<stdio.h>
int main()
{
int xs,km;
double a[50][50]={0},sum;
double km_aver[50]={0}; //对应科目的平均分
double xs_aver[50]={0}; //对应学生的平均分
int i,j;
int m,n,p;
while(~scanf("%d %d",&xs,&km))
{
for(i=0;i<xs;i++)
{
for(j=0;j<km;j++)
{
scanf("%lf",&a[i][j]); //读入学生对应科目的成绩
}
}
int flag=0; //此处flag用于控制输出数据的空格
for(i=0;i<xs;i++)
{
sum=0;
for(j=0;j<km;j++)
{
sum+=a[i][j];
}
if(flag==1)
printf(" ");
xs_aver[i]=sum/km;
printf("%.2lf",xs_aver[i]);
flag=1;
}
printf("\n");
sum=0;
flag=0; //该处flag作用同上
m=0;
for(j=0;j<km;j++)
{
sum=0;
for(i=0;i<xs;i++)
{
sum+=a[i][j];
}
if(flag==1)
printf(" ");
km_aver[m]=sum/xs;
printf("%.2lf",km_aver[m]);
m++;
flag=1;
}
printf("\n");
int flag2; //用于记录该学生是否有科目低于平均分
int cnt=0;
for(i=0;i<xs;i++)
{
flag2=1;
for(j=0;j<km;j++)
{
if(a[i][j]<km_aver[j]) // 如果有科目低于平均分则flag2记0
{
flag2=0;
break;
}
}
if(flag2)
cnt++;
}
printf("%d\n\n",cnt); //“每个测试实例后面跟一个空行”
}
return 0;
}