这个排序问题对我这个初学者而言,还是动了一点儿脑筋的
题目描述
实验小学为了强健学生的身体,每天课间都要组织学生在户外学做广播体操。
这一天,五年级三班的所有同学在老师的指引下将队形排成了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
];
}
}
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
;
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
;
double many
= 0;
for(int i
= 0; i
< z
; ++i
){
many
+= tals
[i
];
}
many
/= z
;
many
= round(many
);
cout
<< many
<< endl
;
int pep
= 0;
for(int i
= 0; i
< z
; ++i
){
if(tals
[i
] >= many
)
++pep
;
}
cout
<< pep
;
return 0;
}