原题链接
乔斯编程原题链接(需登录)https://oj.joyskid.cn/problem.php?id=1453#
题目描述
秋天到了,同学们去橘子园摘橘子。张老师要求同学们把摘好的橘子去掉一个最大的,再去掉一个最小的的橘子,求出剩余的橘子的平均重量,并将剩余的橘子按照由轻到重排序。
输入
第一行是橘子的数量n。(1≤n≤200)
第二行是n个正整数,表示这些橘子的重量。
输出
第一行输出剩余橘子的平均重量,结果保留1位小数。
第二行输出剩余橘子按照由轻到重排序后的结果。
样例输入 & 样例输出
样例输入 1 :
5 9 1 2 1 8
样例输出 1 :
3.7 1 2 8
样例输入 2 :
5 1 2 3 4 5
样例输出 2 :
3.0 2 3 4
题解
(下面有传统题解,可以使用,作者懒得打详细的注释了)
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a;
for(int i=0; i<n; i++) {
int t;
cin >> t;
a.push_back(t);
}
sort(a.begin(), a.end());
a.erase(a.begin());
a.erase(a.end()-1);
double ave = 0;
for(int i=0; i<a.size(); i++) ave += a[i];
cout << fixed << setprecision(1) << ave/a.size() << '\n';
for(int i=0; i<a.size(); i++) cout << a[i] << ' ';
return 0;
}
题解注释
6)本题使用 std::vector 较合适,因为可以用于进行删除最大数和最小数,且不会空出位
12)对数组进行从小到大的排序,注意要用迭代器,不能用 sort(a[0], a[a.size()]);
13~14)删除最大数和最小数,注意要用迭代器,且在14行不得用 a.erase(a.end());
原因见如下图
Vector 数组 v 内部(此处N表示nullptr)
索引 0 1 2 3 4 5 6
值 2 8 3 7 6 1 N
迭代器 ↑ ↑
v.begin() v.end()
你会发现,a.end() 指向了最后一项:nullptr ,因此,要-1,才能指向真正的“最后一项”
15)此处的 ave 表示平均值(Average)
16~17)先计算总值,再除以项数,算出平均值
18)输出剩下的项数
拓展题解
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, a[200];
double sum=0;
cin >> n;
for(int i=0; i<n; i++) { //输入数字并算出数组总和
cin >> a[i];
sum += a[i];
}
sort(a, a+n); //排序
sum -= a[0] + a[n-1]; //不改变数组的值,直接减去
printf("%.1lf\n", sum/(n-2)); //此处n-2值项数少了首项和尾项
for(int i=1; i<n-1; i++) cout << a[i] << ' '; //忽略首项和尾项,直接输出
return 0;
}
好了,点赞,关注,下期见。
记得投票!!!