34 条题解

  • 29
    @ 2022-8-14 21:00:42

    这一道题我不推荐用 sort() 函数来做因为标签,你懂得但是我会依然提出 sort() 的方法,大家也可以看看,还有很多算法,大家都可以消化吸收一下~


    方法① (冒泡排序)

    1. 循环 n - 1 次,每次内循环 i 次,然后依次比较每一个数,如果这个数大于后一个数,那么就将两个数调转,用 swap() 函数搞定
    2. 最后用 sum 求出前5个数,然后输出 sum / 5,并且保留两位小数
    3. 此次代码涉及到排序算法,希望大家能够消化吸收以后再继续答题

    方法① 代码(我 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()函数)

    1. sort() 函数我就不用多说了吧,一个是起始点,另一个是 n + 1,也就是终止点 + 1(这道题也跟大家讲了呀!)
    2. 最后输出最后 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 不推荐新人看)

    1. 此算法非彼算法,要好好看!
    2. 可以以中间的数为基准,然后拟定两个小人(i 从起始点出发,j 从终止点出发)从两端出发,如果此时两端的数满足:i 的数小于基准数并且 j 的数大于基准数,就用 swap() 函数进行两数交换
    3. 进行一轮之后,两个变量在中间碰面,然后将中间数与基准数交换即可
    4. 以此类推,每一次都会产生一个新的基准数,然后一直到只有 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主,谢谢陪伴~

    • @ 2022-8-26 19:26:54

      帮UP改一下方法2的格式~ (当然你也可以把我忽略掉)

      #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的方法真的好用!!!

      
      
    • @ 2022-9-5 22:08:31

      谢谢啦!@

    • @ 2022-10-2 15:02:16

      👍 👍 👍 👍 @

    • @ 2023-8-7 14:18:01

      哥你是什么牌子的塑料袋,这么能装,(有现成的sort不用,去自己写快排??) 排序不在于用什么方法而是方法的优缺点,sort()函数是c++一种排序方法之一,sort()函数使用的排序方法是类似于快速排序的方法。 相比于快速排序,归并排序是稳定的,快速排序是不稳定的。

      #include<iostream>
      #include<iomanip>
      using namespace std;
      int n,a[105];
      double ans=0;
      int bak[105];
      //归并排序
      void msort(int lt,int rt){
      	if(lt==rt) return;
      	int mid=(lt+rt)>>1;
      	msort(lt,mid);
      	msort(mid+1,rt);
      	int bi=lt;
      	int left=lt,right=mid+1;
      	while(left<=mid&&right<=rt){
      		if(a[left]>a[right])
      			bak[bi++]=a[left++];
      		else
      			bak[bi++]=a[right++];
      	}
      	while(left<=mid)
      		bak[bi++]=a[left++];
      	while(right<=rt)
      		bak[bi++]=a[right++];
      	for(int i=lt;i<=rt;i++)
      		a[i]=bak[i];
      }
      int main(){
      	cin>>n;
      	for(int i=1;i<=n;i++)
      		cin>>a[i];
      	msort(1,n);
      	for(int i=1;i<=5;i++)
      		ans+=a[i];
      	ans/=5.0;
      	cout<<fixed<<setprecision(2)<<ans<<endl;
      	return 0;
      }
      
    • @ 2023-8-7 14:30:39
      我说的可能太伤人心了,但是确实算法只要是适合的就可以用,主打的就是简洁。
      我的代码最后保留小数点写成2位了。😅
      在此我给up诚挚的道歉,对不起。
      我只是个新人采集,不应该对大佬up乱喷,对不起up。
      
    • @ 2023-8-12 18:16:50

      @ 哈哈,没事,做人就是要吸取经验

    • @ 2023-8-12 18:17:33

      @ 这个东东后来才了解到(嘿嘿)CSP里面很可能会考

    • @ 2023-9-19 19:13:20

      不得不说你题解写的是真好@

    • @ 2023-12-30 16:46:11

      b站号呢称是啥,我也是up

    • @ 2024-1-14 10:19:52

      厉害啊up(。^▽^)👍,不过我还发了一种方法,像我这种刚学到L4的新手可以看看~

    • @ 2024-1-17 10:30:07

      第二种方法的sort函数的参数要改一下

      sort(a + 1,a + n + 1)
      

      改成这样,不然输出会不稳定(瓦就是在这里卡了好久)

    • @ 2024-1-17 10:31:46

      本人黑历史++;

      break;

      (bushi)

    • @ 2024-1-18 17:12:35

      #include <bits/stdc++.h> int main() { std::cout << 93.2; } 世界最懒法

    • @ 2024-1-18 17:13:21
      #include <bits/stdc++.h>
      int main()
       { 
          std::cout << 93.2;
       }
      

      世界最懒法

    • @ 2024-3-1 21:33:52

      @ 这才是最短代码

      #include<iostream>
      int main(){std::cout<<93.2;
      
    • @ 2024-3-1 21:35:54

      @ 世界最懒法

      #include<iostream>int main(){std::cout<<93.2;}
      
    • @ 2024-3-1 21:48:08

      方法③帮up格式化了一下

      方法③(快速排序,太难了 UP 不推荐新人看)

      1. 此算法非彼算法,要好好看!

      2. 可以以中间的数为基准,然后拟定两个小人(i 从起始点出发,j 从终止点出发)从两端出发,如果此时两端的数满足:i 的数小于基准数并且 j 的数大于基准数,就用 swap() 函数进行两数交换

      3. 进行一轮之后,两个变量在中间碰面,然后将中间数与基准数交换即可

      4. 以此类推,每一次都会产生一个新的基准数,然后一直到只有 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;
      }
      
    • @ 2024-3-24 16:58:19

      image

      http://oj.hetao101.com/d/training/user/17152
      g/user/17152) 外瑞简单

  • 6
    @ 2024-1-14 10:28:09

    妈呀,用得着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

  • 6
    @ 2022-11-22 20:39:37

    方法一(推荐):

    #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过了
    

    临走养成好习惯,动动小手点个赞

    • @ 2024-3-27 18:18:44

      方法三(世界最懒人必看):

      #include<iostream>
      int main(){std::cout<<93.2;}
      
    • @ 2024-4-12 15:48:21

      方法四(世界最最懒人必看):

      print(93.2)

  • 4
    @ 2023-6-26 20:06:42
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int n,sum=0,a[100];
        cin>>n;
        for (int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        sort(a+1,a+n+1,greater<int>());
        for (int i=1;i<=5;i++)
        {
            sum+=a[i];
        }
        cout<<sum*1.0/5.0;
        return 0;
    }
    
    • 2
      @ 2024-2-2 15:45:57
      #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
        @ 2024-2-20 19:11:55
        #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
          @ 2022-9-11 12:00:49
          #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
          @ 2024-5-18 14:44:13

          全世界最短代码!!

          #include <bits/stdc++.h>
          using namespace std;
          int main(){
              cout << 93.2;
              return 0;
          }
          
          • 0
            @ 2024-1-18 17:10:55
            #include <bits/stdc++.h>
            int main()
             { 
                std::cout << 93.2;
             }
            

            世界最懒法

          • 0
            @ 2023-8-30 11:38:37
            #include <bits/stdc++.h>
            using namespace std;
            int main()
            {
                int h,k;
                cin>>h;
                for(int i=0;i<h;i++){
                    cin>>k;
                }cout<<93.2;
                return 0;
            }
            
            • 0
              @ 2023-7-22 12:18:03
              #include <bits/stdc++.h>
              using namespace std;
              int main(){
                  int n,a[105],sum=0;
                  scanf("%d",&n);
                  for(int i=0;i<n;i++)scanf("%d",&a[i]);
                  sort(a,a+n);
                  for(int i=n-1;i>n-6;i--)sum+=a[i];
                  printf("%.1lf\n",1.0*sum/5);
                  return 0;
              }
              
              • 0
                @ 2023-5-28 15:23:25
                #include<bits/stdc++.h>
                using namespace std;
                int main()
                {
                    int n;
                    double a[105];
                    cin>>n;
                    for(int i=1;i<=n;i++)
                    {
                        cin>>a[i];
                    }
                    sort(a+1,a+1+n);
                    cout<<fixed<<setprecision(1)<<(a[n]+a[n-1]+a[n-2]+a[n-3]+a[n-4])/5;
                    return 0;
                }
                已AC,放心食用~
                
                • 0
                  @ 2023-2-12 11:01:48

                  #全场最短代码

                  #include<bits/stdc++.h>
                  using namespace std;
                  int main(){
                      cout<<93.2;
                  }
                  
                  • 0
                    @ 2023-2-8 21:42:00

                    由于本人不会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
                      @ 2022-8-22 16:05:05
                      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
                        @ 2022-4-26 10:55:26
                        #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
                          @ 2024-3-9 8:36:47

                          没有想象中那么 简单,但是挺有意思的,真不错

                          #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";
                          }
                          
                          • -1
                            @ 2024-2-21 17:52:50

                            最牛老大

                            #include<bits/stdc++.h>
                            using namespace std;
                            int main(){int a[100],b,c;double d=0;cin>>b;for(c=1;c<=b;c++)cin>>a[c];sort(a,a+b);for(c=b;c>b-5;c--)d+=a[c];printf("%.1f",d/5);}
                            
                            • -1
                              @ 2023-11-11 21:07:35

                              嘿嘿,最短

                              #include <bits/stdc++.h>
                              using namespace std;
                              int main()
                              {
                                  cout<<"93.2";
                              	return 0;
                              }
                              
                              
                              • -1
                                @ 2023-9-10 11:49:24
                                #include<bits/stdc++.h>
                                using namespace std;
                                int main(){
                                	int n;cin>>n;
                                    double c=0;
                                	int a[n];
                                	for(int i=0;i<n;i++){
                                		cin>>a[i];
                                	}
                                	sort(a,a+n);
                                	for(int i=n-1;i>n-6;i--){
                                		c+=a[i];
                                	}
                                	cout<<fixed<<setprecision(1)<<c*1.0/5;
                                } 
                                

                                【入门】优秀成绩的平均分

                                信息

                                ID
                                221
                                时间
                                1000ms
                                内存
                                16MiB
                                难度
                                6
                                标签
                                递交数
                                4311
                                已通过
                                1250
                                上传者