1149: 零起点学算法56——青年歌手大奖赛_评委会打分

谁践踏了优雅 2023-01-11 08:50 247阅读 0赞

Description

青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。

Input

青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。

Output

对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。

" class="reference-link">Sample Input 5f8f312f51791b8bb0ed0ae07c2ffa43.gif

  1. 3 99 98 97
  2. 4 100 99 98 97

Sample Output

  1. 98.00
  2. 98.50

Source

零起点学算法

Code

一开始想排序,然后去掉一头一尾,但是答案始终不正确

  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. while(~scanf("%d",&n))
  8. {
  9. int a[20]={999};
  10. int t=-10;
  11. int sum=0;
  12. for(int i=0;i<n;i++)
  13. {
  14. cin>>a[i];
  15. sum+=a[i];
  16. }
  17. for(int i=0;i<n;i++)
  18. {
  19. if(a[i]>a[i+1])
  20. {
  21. t=a[i+1];
  22. a[i+1]=a[i];
  23. a[i]=t;
  24. }
  25. }
  26. sum=sum-a[0]-a[n-1];
  27. float ave=(float)sum/(n-2);
  28. printf("%.2f\n",ave);
  29. }
  30. }

因为这题想用冒泡排序,但是冒泡排序是需要用双层的,如果按照旧代码就只进行了一次冒泡排序。改进如下

  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. while(~scanf("%d",&n))
  8. {
  9. int a[20]={999};
  10. int t=-10;
  11. int sum=0;
  12. for(int i=0;i<n;i++)
  13. {
  14. cin>>a[i];
  15. sum+=a[i];
  16. }
  17. ///i的范围0~n-2,j的范围n-2~0,就可以实现a[0]与后面直到a[n-1]的大小比较
  18. for(int i=0;i<n-1;i++)
  19. {
  20. for(int j=0;j<n-1-i;j++)
  21. if(a[j]>a[j+1])
  22. {
  23. t=a[j+1];
  24. a[j+1]=a[j];
  25. a[j]=t;
  26. }
  27. }
  28. sum=sum-a[0]-a[n-1];
  29. float ave=(float)sum/(n-2);
  30. printf("%.2f\n",ave);
  31. }
  32. }

这个方法每一轮都要遍历所有的元素,因此时间复杂度是O(n^2),改进如下,设置标志量flag,若进行排序中则flag=1,表示还需要继续排序,否则直接跳出循环。这样的话时间复杂度有效降低。

  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. while(~scanf("%d",&n))
  8. {
  9. int a[20]={999};
  10. int t=-10;
  11. int sum=0;
  12. for(int i=0;i<n;i++)
  13. {
  14. cin>>a[i];
  15. sum+=a[i];
  16. }
  17. ///i的范围0~n-2,j的范围n-2~0,就可以实现a[0]与后面直到a[n-1]的大小比较
  18. for(int i=0;i<n-1;i++)
  19. {
  20. int flag=0;
  21. for(int j=0;j<n-1-i;j++)
  22. if(a[j]>a[j+1])///说明仍然需要排序
  23. {
  24. t=a[j+1];
  25. a[j+1]=a[j];
  26. a[j]=t;
  27. flag=1;
  28. }
  29. ///没被排,说明是顺序的
  30. if(flag==0)
  31. break ;
  32. }
  33. sum=sum-a[0]-a[n-1];
  34. float ave=(float)sum/(n-2);
  35. printf("%.2f\n",ave);
  36. }
  37. }

冒泡排序法参考文章https://blog.csdn.net/lu_1079776757/article/details/80459370

但是文章中有一处错误,flag=0的位置放错了,正确版是我的代码

此题还有一种解法,没有进行排序,直接找出最大最小值即可

  1. #include<stdio.h>
  2. #include<iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. while(~scanf("%d",&n))
  8. {
  9. int a[20]={0};
  10. int max=-10;
  11. int min=999;
  12. int t=-1;
  13. int sum=0;
  14. for(int i=0;i<n;i++)
  15. {
  16. cin>>a[i];
  17. sum+=a[i];
  18. }
  19. ///i的范围0~n-2,j的范围n-2~0,就可以实现a[0]与后面直到a[n-1]的大小比较
  20. for(int i=0;i<n;i++)
  21. {
  22. if(a[i]>max)///说明仍然需要排序
  23. max=a[i];
  24. if(a[i]<min)
  25. min=a[i];
  26. }
  27. sum=sum-max-min;
  28. float ave=(float)sum/(n-2);
  29. printf("%.2f\n",ave);
  30. }
  31. }

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读

    相关 歌手大奖赛(C语言)

    歌星大奖赛中,有 10 个评委为参赛的选手打分,分数为 1~100 分。选手最后得分 为:去掉一个最高分和一个最低分后其余 8 个分数的平均值。请编写一个程序实现。题 目...