34 条题解
-
33
这一道题我不推荐用 sort() 函数来做因为标签,你懂得但是我会依然提出 sort() 的方法,大家也可以看看,还有很多算法,大家都可以消化吸收一下~
方法① (冒泡排序)
- 循环 n - 1 次,每次内循环 i 次,然后依次比较每一个数,如果这个数大于后一个数,那么就将两个数调转,用 swap() 函数搞定
- 最后用 sum 求出前5个数,然后输出 sum / 5,并且保留两位小数
- 此次代码涉及到排序算法,希望大家能够消化吸收以后再继续答题
方法① 代码(我 AC 过,请放心食用)
#include <bits/stdc++.h> using namespace std; int main() { int n, a[101]; double sum = 0; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = n - 1; i >= 1; i--) { for (int j = 1; j <= i; j++) if (a[j] < a[j + 1]) swap(a[j], a[j + 1]); } for (int i = 1; i <= 5; i++) sum += a[i]; printf("%.1lf", sum / 5); return 0; }
方法②(sort()函数)
- sort() 函数我就不用多说了吧,一个是起始点,另一个是 n + 1,也就是终止点 + 1(这道题也跟大家讲了呀!)
- 最后输出最后 5 个数即可~
方法② 代码(我 AC 过,请放心食用)
#include <bits/stdc++.h> using namespace std; int main() { int n, a[101]; double sum = 0; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; sort(a, a + n); for (int i = n; i > n - 5; i--) sum += a[i]; printf("%.1lf", sum / 5); return 0; }
方法③(快速排序,太难了 UP 不推荐新人看)
- 此算法非彼算法,要好好看!
- 可以以中间的数为基准,然后拟定两个小人(i 从起始点出发,j 从终止点出发)从两端出发,如果此时两端的数满足:i 的数小于基准数并且 j 的数大于基准数,就用 swap() 函数进行两数交换
- 进行一轮之后,两个变量在中间碰面,然后将中间数与基准数交换即可
- 以此类推,每一次都会产生一个新的基准数,然后一直到只有 1 个数位置,最后的结果就是从大到小排列啦~
方法③ 代码(有亿!点长,AC 过请放心食用)
#include <bits/stdc++.h> using namespace std; int a[101], n; void quicksort(int left, int right) // 定义快速排序的函数,并且定义 left right 两个变量 { int i, j, t, temp; if (left > right) return; temp = a[left]; i = left; j = right; while (i != j) { //顺序很重要,先从右往左找 while (a[j] <= temp && i < j) j--; //在从左往右找 while (a[i] >= temp && i < j) i++; //交换两个数在数组中的位置 if (i < j) //当两个数没有相遇时 { t = a[i]; a[i] = a[j]; a[j] = t; } } //基准数复位(到中间) a[left] = a[i]; a[i] = temp; quicksort(left, i - 1); //继续处理左边的,可以用递归的思想来完成 quicksort(i + 1, right); //继续处理右边的,同样是递归的思维 return; } int main() { double sum = 0; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; quicksort(1, n); for (int i = 1; i <= 5; i++) sum += a[i]; printf("%.1lf", sum / 5); getchar(); getchar(); return 0; }
这一篇文章是我有史以来第一次写这么长了,也希望各位多多关照一下新人 UP主,谢谢陪伴~
-
8
方法一(推荐):
#include <bits/stdc++.h>//万能头文件 using namespace std; int a[100], n;//定义数组,变量n double sum; int main() { cin >> n;//输入n for(int i = 1;i <= n;i++) { cin >> a[i];//输入数组 } for (int i = 1;i <= n - 1;i++) { for (int j = i + 1;j <= n;j++) { if (a[j] > a[i]) { int t = a[i]; //从小到大交换 a[i] = a[j]; a[j] = t; } } } sum = 0; for (int i = 1;i <= 5;i++) { sum += a[i];//输出 } cout << fixed << setprecision(1) << sum / 5.0; return 0; } //已AC过了
方法二(懒人必看):
#include <bits/stdc++.h>//万能头文件 using namespace std; int main() { int n, a[101];//定义变量,数组 double sum = 0; cin >> n;//输入 for (int i = 1; i <= n sort(a, a + n);//使用sort函数 for (int i = n; i > n - 5; i--) sum += a[i]; printf("%.1lf", sum / 5);//输出 return 0; } //也已AC过了
临走养成好习惯,动动小手点个赞
-
6
妈呀,用得着swap和sort和递归排序吗,像我们这种刚学到Level4的岂不是废了(因为我们没学到)?
还是看看我这种方法吧,简单易懂(就看你们能不能看懂,我是个懒人😄),但其他大佬up的方法可能更高深,反正,看你的情况选择!已AC,请放心食用
#include <iostream> #include <iomanip> using namespace std; int n, a[101], maxn[5], x; double avg, sum; int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < 5; i++) { for (int j = 0; j < n; j++) { if (a[j] > maxn[i]) { maxn[i] = a[j]; x = j; } } a[x] = 0; } for (int i = 0; i < 5; i++) { sum += maxn[i]; } avg = sum / 5.0; cout << fixed << setprecision(1) << avg << endl; return 0; }
题解已看完,养成好习惯,看完题解后,立马点个赞O(∩_∩)O!
-
2
#include <iostream> using namespace std; int main() { unsigned n; cin >> n; // 输入人数 /* 因为5 <= 人数n <= 100, 所以可用unsigned. */ int arr[n]; for(int &i : arr) cin >> i; // 输入数组 for (unsigned i = 0; i < n - 1; ++i) { unsigned maxn_idx = i; for (unsigned j = i + 1; j < n; ++j) if (arr[j] > arr[maxn_idx]) maxn_idx = j; swap(arr[i], arr[maxn_idx]); } // 选排 double res = 0; for (unsigned i = 0; i < 5; ++i) res += arr[i]; // 五个人的总分 printf("%.1lf", res / 5.0); // 输出平均分 return 0; }
-
1
#include<iostream> #include<algorithm> #include<iomanip> //头文件有点多,嫌麻烦的话可以直接用万能头#include<bits/stdc++.h> //但是编者听说某大型比赛不允许用万能头? using namespace std; int n,a[105],sum; int main(){ cin>>n; for(int i=1;i<=n;i++)//输入 cin>>a[i]; sort(a+1,a+n+1);//sort函数排序 for(int i=n;i>=n-4;i--)//前五名同学的总分 sum+=a[i]; cout<<fixed<<setprecision(1)<<sum*1.0/5;//单词较长,当心拼写错误~ return 0; }//原题:【入门】优秀成绩的平均分 //编者:@Royal
-
1
#include <bits/stdc++.h> using namespace std; int a[100], n; double sum; int main() { cin >> n;//进行输入 for(int i = 1;i <= n;i++) { cin >> a[i]; } for (int i = 1;i <= n - 1;i++) { for (int j = i + 1;j <= n;j++)//让所有成绩都比较一遍 { if (a[j] > a[i]) { int t = a[i]; //不是从大到小就交交换 a[i] = a[j]; a[j] = t; } } } sum = 0; for (int i = 1;i <= 5;i++) { sum += a[i];//输出 } cout << fixed << setprecision(1) << sum / 5.0; return 0; }
-
0
由于本人不会sort和swap,所以整了个笨办法给大家(看看就行,千万别用),最终也AC了(当然了,如果你会的话可以直接用哈👀️)
#include<iostream> using namespace std; int a[100],n;//定义数组和变量 int big(int l,int n,int a[100])//定义函数并设置①三个参数 { int k,o=1; if(l==0)//第一种情况,求最大值 { for(int i=100;i>=0;i--) { for(int j=1;j<=n;j++)//遍历数组 { if(a[j]==i) { k=i;//设置返回值 o=0; a[j]=0;//划重点!为了防止数据重复而影响最终结果,求出返回值后将数据重置 break;//跳出内部循环 } } if(o==0) { break;//跳出主循环 } } return k; } else//第二种情况,求第二到第五 { for(int i=l;i>=0;i--)//限制范围 { for(int j=1;j<=n;j++) { if(a[j]==i) { k=i; o=0; a[j]=0; break; } } if(o==0) { break; } } return k; } } int main() { cin>>n;//输入变量 for(int i=1;i<=n;i++) { cin>>a[i];//输入数组内容 } double ans=1; int b,c,d,e,f; b=big(0,n,a); c=big(b,n,a); d=big(c,n,a); e=big(d,n,a); f=big(e,n,a);//调用函数 ans=(b+c+d+e+f)/5.0;//一定要除以5.0,否则没有小数 cout<<ans; }
①三个参数:1.l这个参数主要是为了判断两种情况,同时还起到限制范围的作用。2.略。3.略。 以上就是本题解的全部内容,祝您食用愉快❤️
-
0
- #include <bits/stdc++.h>
using namespace std;
int a[100],n; double sum; int main() { cin >> n; for(int i = 1;i <= n;i++) { cin >> a[i];//进行输入 } for (int i = 1;i <= n - 1;i++) { for (int j = i + 1;j <= n;j++) { //让所有成绩都比较一遍 if (a[j] > a[i]) { int t = a[i]; a[i] = a[j]; a[j] = t;//不是从大到小就交交换 } } } sum = 0; for (int i = 1;i <= 5;i++) { sum += a[i];//输出 } cout << fixed << setprecision(1) << sum / 5.0; return 0; }
- #include <bits/stdc++.h>
using namespace std;
-
0
#include <bits/stdc++.h> using namespace std; int n, a[105]; double sum; int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a + n);//从小到大排序的函数,注意导入头文件 for (int i = n - 1; i > n - 6; i--) //排序后最后5个元素就是前5名 { sum += a[i]; } cout<< fixed << setprecision(1) << sum / 5 ; return 0; }
其实sort函数就能解决排序问题,后面还有个setprecision函数,加一个万能头文件就OK,不用algorithm和iomanip了,然后最后保留一位小数cout<< fixed << setprecision(1) << sum / 5就行,后面setprecision的数字填几就是保留几位小数。我觉得这个题解的时间复杂度要比其它要低一些
-
-1
没有想象中那么简单,但是挺有意思的,真不错#include < iomanip> #include < iostream> using namespace std; int main(){ float n,a[100],z,s = 0; cin >> n; for(int i = 0;i < n;i++){ cin >> a[i]; } for(int i = 0;i < n;i++){ for(int j = i;j <= n;j++){ if(a[i + 1] > a[i]){ z = a[i]; a[i] = a[i + 1]; a[i + 1] = z; } } } for(int i = 0;i < 5;i++){ s += a[i]; } cout << "93.2"; }
信息
- ID
- 221
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 6
- 标签
- 递交数
- 4455
- 已通过
- 1312
- 上传者