这个排序问题对我这个初学者而言,还是动了一点儿脑筋的
题目描述
实验小学为了强健学生的身体,每天课间都要组织学生在户外学做广播体操。
这一天,五年级三班的所有同学在老师的指引下将队形排成了M行N列。现已知所有同学的身高,数值为整数,单位:厘米。要求在所有同学中:
1.挑选出每列身高最高的同学作为此列的小队长为同学们带操;
2.将所有同学按身高从高到低的顺序进行排队;
3.求出所有同学们的平均身高(要求:四舍五入保留整数);
4.统计出不小于平均身高的学生人数。
请同学们用计算机编程的方法来解决以上问题。
输入
输入共有M+1行:
1.第一行有:用11个空格隔开的两个整数M、N,分别代表学生的行数和列数(其中 1≤M≤10,1≤N≤10);
2.后M行有:每一行对应的是N列数据,表示所有学生的身高尺寸,数值为整数,单位:厘米(其中:140厘米≤身高≤170厘米,不需判断此条件),数据之间空1格。
输出
输出共有M+3行:
1.前M行:每行一个数据为各列中身高最高的同学的高度 (要求:各列按从左到右的顺序);
2.第M+1行:为所有同学按身高从高到低的顺序排队的高度 (要求数据之间有1个空格);
3.第M+2行:只有一个数据为所有同学的平均身高 (要求:四舍五入,保留整数);
4.第M+3行:只有一个数据,为不小于平均身高的学生人数。
样例
输入
3 4
141 161 156 167
170 163 168 157
162 145 153 163
输出
170
163
168
167
170 168 167 163 163 162 161 157 156 153 145 141
159
7
思路
因为题目要求输入多行学生身高,并且要输出每一列的最大值,所以使用二维数组比较方便,后面再转为一维数组冒泡排序。
题解
#include <bits/stdc++.h>
using namespace std;
int main(){
int m/*行*/, n/*列*/;
cin >> m >> n;
double tall[m+1]/*行*/[n+1]/*列*/; //方阵中每个学生的身高
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
cin >> tall[i][j];
}
} //输入
/***1.挑选出每列身高最高的同学作为此列的小队长为同学们带操***/
double taller[n+1]/*中转站*/; //每一列中最高的学生分别的身高
for(int i = 0; i < n; ++i){
taller[i] = tall[0][i];
} //初始化擂台
for(int i = 0; i < n; ++i){
for(int j = 1; j < m; ++j){
if(tall[j][i] > taller[i])
taller[i] = tall[j][i];
}
}
for(int i = 0; i < n; ++i)
cout << taller[i] << endl;
/***2.将所有同学按身高从高到低的顺序进行排队***/
double tals[m*n+1]; //方阵中每个学生的身高
int z = 0;
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
tals[z] = tall[i][j];
++z;
}
} //化二维为一维,全体同学一家亲
double pk/*中转站*/ = 0; //全体同学身高打擂台
int zc = z;
while(zc){
for(int i = 1; i < zc; ++i){
if(tals[i] > tals[i-1]){
pk = tals[i];
tals[i] = tals[i-1];
tals[i-1] = pk;
}
}
--zc;
}
for(int i = 0; i < z; ++i){
if(i == 0)
cout << tals[i];
else
cout << " " << tals[i];
}
cout << endl;
/***3.求出所有同学们的平均身高(要求:四舍五入保留整数)***/
double many = 0;
for(int i = 0; i < z; ++i){
many += tals[i];
}
many /= z;
many = round(many);
cout << many << endl; //四舍五入保留整数
/***4.统计出不小于平均身高的学生人数***/
int pep = 0; //累加器
for(int i = 0; i < z; ++i){
if(tals[i] >= many)
++pep;
}
cout << pep;
return 0;
}