
🚗🚗🚗🚗🚗🚗🚗 数据结构专栏🚗🚗🚗🚗🚗🚗🚗🚗🚗🚗
🛹🛹🛹🛹🛹🛹🛹小知识总结分享🛹🛹🛹🛹🛹🛹🛹🛹🛹🛹
🚀🚀🚀🚀🚀🚀🚀题目历练场🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
🚢🚢🚢🚢🚢🚢🚢功能包与集合类介绍🚢🚢🚢🚢🚢🚢🚢🚢🚢
🛞🛞🛞🛞🛞🛞🛞java EE🛞🛞🛞🛞🛞🛞🛞🛞🛞🛞🛞🛞🛞
😘😘😘😘😘😘😘Agent大模型😘😘😘😘😘😘😘😘😘😘😘😘
今天和大家一起分享一道基础的算法题目
- 题目来源 : HDOJ

题目
- 这个题目本省不复杂 但是对于新手朋友存在很多坑点 我认为对于二维数组和循环逻辑的理解有一个较为深入的考察。
cpp
#include <iostream>
using namespace std;
/*
2 3
10 20 30
56 4 30
30.00 45.00
33.00 12.00 30.00
0
*/
//复习
int main() {
int n, m;
int arr[51][6];
double sa[51];
double ca[6];
int count ;
while (cin >> n >> m) { //反复输入
//存进数据
for (int i = 0; i < n; ++i)
{
for (int j = 0; j <m; ++j)
{
cin >> arr[i][j];
}
}
// 每一位同学的平均成绩 n 固定 加和m
for (int i = 0; i < n; ++i)
{
sa[i] = 0; // 初始化每一位同学平均成绩
for (int j = 0; j < m; ++j)
{
sa[i] += arr[i][j];
}
sa[i] /= m; //每一位学生的平均成绩计算完成
}
// 每一个学科的平均成绩 m 固定 加和n
for (int i = 0; i < m; ++i)
{
ca[i] = 0; // 初始化每一学科的平均成绩
for (int j = 0; j < n; ++j)
{
ca[i] += arr[j][i]; // 注意是i 表示列 变化是行的数据
}
ca[i] /= n; //每一位学生的平均成绩计算完成
}
//遍历数组 进行判断符合条件的数据
count = 0;
for (int i = 0; i < n; ++i)
{
int sum = 0;
for (int j = 0; j < m; ++j)
{
sum += ( arr[i][j] >= ca[j]); //某位同学的第j门成绩是不是大于等于第i门课程的平均成绩
}
//此时一个同学的数据已经便利完成;
if (sum == m) count++;
}
// 遍历打印 每一个同学的平均成绩
for (int i = 0; i < n; ++i)
{
//神之一手 处理空格
if (i != 0) {
cout << ' ';
}
printf("%.2f" , sa[i]);
}
cout << endl;
// 遍历打印 每一个学科的平均成绩
for (int i = 0; i < m; ++i)
{
//神之一手 处理空格
if (i != 0) {
cout << ' ';
}
printf("%.2f", ca[i]);
}
cout << endl;
cout << count << endl;
}
return 0;
}
题目总结
这道 HDOJ 2023 题目虽然基础,但考察了多个关键知识点,值得新手朋友认真复盘:
-
二维数组的存储与遍历:使用
arr[51][6]存储 n 位同学、m 门课程的成绩,需要理解行(同学)与列(课程)的对应关系。 -
双重循环的嵌套逻辑:计算每位同学的平均成绩时,外层循环是同学、内层循环是课程;计算每门课程的平均成绩时,外层循环是课程、内层循环是同学,行列互换是本题最大的坑点。
-
条件统计:判断每位同学是否所有科目都达到该科目的平均分,需要逐门比较并累加计数。
- 这道题虽然代码不长,但完整覆盖了二维数组、循环嵌套、格式化输出等基础能力。建议新手朋友:
- 先手写一遍行列遍历的过程,理清下标含义;
- 再独立实现一遍,重点检查学科平均分的计算;
- 最后对照标准输出验证格式是否正确。
掌握这道题,对后续更复杂的矩阵类题目会很有帮助。
- 我是Dylan
- 无限进步