21 条题解

  • 18
    @ 2023-8-6 19:49:29

    P1023题解


    题目大意

    存在n个整数,求将这n个整数变成一样大需要移动的数字之和。


    完整思路如下

    计算n个数的平均数t,累加所有比平均数大的数a[i]中,比平均数大的那部分数值a[i]-t

    AC代码

    #include <bits/stdc++.h>
    using namespace std;  //By 洋葱头
    int a[10001], sum, num;
    int main()
    {
        int n;
        cin >> n;
        for(int i = 1; i <= n; i++)
        {
            cin >> a[i];
            sum += a[i];
        }
        sum /= n;
        for(int i = 1; i <= n; i++)
        {
            num += abs(sum - a[i]);
        }
        cout << num / 2;
        return 0;
    }
    

    作者:洋葱头 (hetao1394742)

    大哥大嫂点个赞吧

    • 11
      @ 2023-4-21 22:23:24

      P1023 干草堆

      题目描述

      核晶学院后勤部将干草打包成了一个个正方体,称它为干草捆,每个干草捆高度相同都为11,干草捆叠起来称为干草堆。

      后勤部在晾晒干草时,将所有干草打包成若干个干草捆并分成n个等高的干草堆,但是调皮的学生们在干草堆之间移动了一些干草捆,使得各个干草堆的高度可能不相同了。

      现在给出所有干草堆的高度,请帮后勤部确定,为了使所有干草堆恢复到原来相同的高度,至少要移动的最小干草捆数量。


      思路

      image

      这个就是将每个数与之前算出的平均值比较一下,然后把那些数加起来 / 2,就可得出答案。

      不过由于有的算出来是负数,所以肯定要用 abs函数过一下。

      可以这样实现:

      for(int i = 1;i <= n;i++)
      {
          num += abs(sum - a[i]);
      }
      

      参考代码

      #include <iostream>//hetao3097453
      using namespace std;
      int a[10001],sum,num;
      int main()
      {
          int n;
          cin >> n;
          for(int i = 1;i <= n;i++)
          {
              cin >> a[i];
              sum += a[i];
          }
          sum /= n;
          for(int i = 1;i <= n;i++)
          {
              num += abs(sum - a[i]);
          }
          cout << num / 2;
          return 0;
      }
      

      hetao3097453

      2023年4月21日

      • @ 2023-4-22 15:50:03

        @ 注意一下哈 第一行

        #include<iostream>
        

        需要替换成

        #include<bits/stdc++.h>
        

        或者加一个

        #include<algorithm>
        

        不然会编译错误

      • @ 2023-4-28 18:08:12

        @编译错误???

        image

        服了,怎么会编译错误???

      • @ 2023-4-28 18:08:36

        你在哪编译的

      • @ 2023-7-21 20:47:04

        @人家说的是对的,会编译错误,你都调用函数了不加函数库?

      • @ 2023-7-25 15:44:21

        你们换成c++17试试

      • @ 2023-7-25 15:55:55

        @ image

      • @ 2023-7-25 15:56:29

        @ image

      • @ 2023-7-25 15:58:28

        @ image image but image

      • @ 2023-8-3 21:02:04

        @ c++11,c++14,c++17,c++98的代码格式和规则可能都不一样,如果你用c++98就得加一个

        #include <algorithm>
        

        我用的是c++98,所以我的开头是

        #include<iostream>
        #include <algorithm>
        using namespace std;
        int a[10005],n,sum,cnt;
        int main()
        
      • @ 2023-8-3 21:03:06

        @ @ c++11,c++14,c++17,c++98的代码格式和规则可能都不一样,如果你用c++98就得加一个

        #include <algorithm>
        

        我用的是c++98,所以我的开头是

        #include<iostream>
        #include <algorithm>
        using namespace std;
        int a[10005],n,sum,cnt;
        int main()
        
      • @ 2023-8-3 21:08:20

        @ 你应该用的是c++98吧

      • @ 2023-9-2 21:37:12

        只有我一个人傻兮兮的编了一个绝对值函数吗?

      • @ 2023-9-2 21:37:32

        一下子没想起来@

      • @ 2023-9-2 21:38:50

        像上面那一位那么做不就完了吗?

        #include <bits/stdc++.h>//万能头文件,永远的王

      • @ 2023-9-2 21:40:31

        @ 你为啥每次代码框里的字是五颜六色的,我```ccp

        的筐里的字就是黑的

      • @ 2023-10-2 16:40:32

        @ 不对啊,abs函数不应该在<cmath>里吗,而且我测试了一下,没问题,C++14能过,应该是把abs放到<iostream>里了

      • @ 2023-10-2 16:42:09

        @ 现在标准不是用C++14了吗

      • @ 2023-12-23 14:02:17

        @ 为啥我用C++14和C++17都没编译错误啊?

      • @ 2024-5-16 18:05:24

        @ 写```c++,别写ccp

    • 5
      @ 2023-4-22 19:05:36
      #include <bits/stdc++.h>
      using namespace std;
      int a[10001],sum,num;
      int main()
      {
          int n;
          cin >> n;
          for(int i = 1;i <= n;i++)
          {
              cin >> a[i];
              sum += a[i];
          }
          sum /= n;
          for(int i = 1;i <= n;i++)
          {
              num += abs(sum - a[i]);
          }
          cout << num / 2;
          return 0;
      }
      
      • 3
        @ 2024-4-26 20:59:51

        一个赞拿走

        #include <bits/stdc++.h>
        using namespace std;
        int a[10001],sum,num;
        int main()
        {
            int n;
            cin >> n;
            for(int i = 1;i <= n;i++)
            {
                cin >> a[i];
                sum += a[i];
            }
            sum /= n;
            for(int i = 1;i <= n;i++)
            {
                num += abs(sum - a[i]);
            }
            cout << num / 2;
            return 0;
        }
        

        笑话时间到(3个) 1:朋友说我有双下巴了,都是经常低头刷手机导致的。从那之后,每次刷手机我都举高高地往上看。没想到,一个月之后我有了抬头纹。 2:一个推销员对一个家庭主妇喋喋不休地把他所有的产品都做了介绍,然后问:您看你缺什么?主妇不快地答道:缺钱。推销员从兜里掏出一张名片,说道:小额贷款了解一下…… 3:听说戒烟能延长十年的寿命,于是我反复的戒烟、吸烟、戒烟又吸烟,长生不老的秘诀被我找到了。 笑话结束,点个赞吧,求求了; 下一个题更新一个恐怖故事,期待吧。。。。。。

        • 2
          @ 2023-2-27 17:13:11
          题目大意
                  存在n个整数,求将这n个整数变成一样大需要移动的数字之和。

          提示
                  不用考虑每个比平均数大的数字分别分给了哪些较小的数字,只要确定一点,不论怎么分,每个比平均数大的数字,大的那部分,都要分给较小的数。

          完整思路
                  计算n个数的平均数t,累加所有比平均数大的数a[i]中,比平均数大的那部分数值a[i]-t。

          核心代码
        • 1
          @ 2024-3-15 21:32:16

          P1023

          -题目描述-

          核晶学院后勤部将干草打包成了一个个正方体,称它为干草捆,每个干草捆高度相同都为11,干草捆叠起来称为干草堆。 后勤部在晾晒干草时,将所有干草打包成若干个干草捆并分成n个等高的干草堆,但是调皮的学生们在干草堆之间移动了一些干草捆,使得各个干草堆的高度可能不相同了。 现在给出所有干草堆的高度,请帮后勤部确定,为了使所有干草堆恢复到原来相同的高度,至少要移动的最小干草捆数量。

          -分析-

          先计算n个数的平均数,再将每个数距离平均数的距离计算出来,因为有多的就有少的,所以最后除以2就可以了。

          -核心代码-

          sum /= n;
          for(int i = 1; i <= n; i++)
          {
              num += abs(sum - a[i]);
          }
          cout << num / 2;
          
          • 1
            @ 2023-11-27 20:26:05

            挑战全网行数最少(3行)

            #include <bits/stdc++.h>
            int n, a[10000], sum, ans;
            int main(){scanf("%d",&n);for (int i = 0;i < n;i++){scanf("%d", &a[i]), sum += a[i];}sum /= n;for (int i = 0;i < n;i++) if (a[i] > sum) ans += a[i] - sum; printf("%d", ans);}
            
            # !!!请勿一口嘎资掉!!!
            • 1
              @ 2023-10-2 16:37:26

              这道题我一开始思路没问题,结果后面走偏了,幸亏又走回正轨 首先,每个干草堆高度肯定是一个平均值,因为我们要把每一堆变成平均值,所以我们要把每一堆变成平均值所以我们要将平均值与每一项比较,求出的非负整数差累加,说明有多少干草捆不合格(多或少),但因为我们移动一个干草捆就去除掉两个不合法的干草捆,所以结果要除以2

              上菜!!!(已AC,请放心食用)

              #include <iostream>
              using namespace std;
              int main(){
                  int n,a[10001],sum=0,ans=0;
                  cin>>n;
                  for(int i=1;i<=n;i++){
                      cin>>a[i];
                      sum+=a[i];
                  }
                  const int avg=sum/n;
                  for(int i=1;i<=n;i++){
                      ans+=abs(avg-a[i]);
                  }
                  cout<<ans/2<<endl;
                  return 0;
              }
              

              提示!!!比C++98晚期的应该能过,如果是C++98就是:

              #include <iostream>
              #include <algorithm>//C++98里avg还在algorithm里
              using namespace std;
              int main(){
                  int n,a[10001],sum=0,ans=0;
                  cin>>n;
                  for(int i=1;i<=n;i++){
                      cin>>a[i];
                      sum+=a[i];
                  }
                  const int avg=sum/n;
                  for(int i=1;i<=n;i++){
                      ans+=abs(avg-a[i]);
                  }
                  cout<<ans/2<<endl;
                  return 0;
              }
              
              • 1
                @ 2023-9-24 11:56:01
                #include <bits/stdc++.h>
                using namespace std;
                int main()
                {
                    int a[10005];
                    int n,sum = 0,avg = 0;
                    cin >> n;
                    for (int i = 1;i <= n;i++)
                    {
                          cin >> a[i];
                          sum += a[i];
                    }
                    avg = sum / n;
                    int move = 0;
                    for (int i = 1;i <= n;i++)
                    {
                        move += abs(a[i] - avg);
                    }
                    cout << move / 2;
                    return 0;
                }
                

                这道题用数学方法解决 ,先算出平均值,再看每堆和平均值相差几,由于每次移动一堆到另一堆,这堆减一,那堆加一。所以再将相差的总和除以2便是移动的次数

                • 1
                  @ 2023-9-3 8:33:18

                  讲讲这道题代码的思路,代码写的都是一样的,我就以hetao879145的代码为准

                  大概思路 先计算n个数的平均数,再将每个数距离平均数的距离计算出来,因为有多的就有少的,所以最后除以2就可以了。

                  细化问题 求平均数 先求出和,再除以n。

                  for(int i=1;i<=n;i++)
                      {
                          cin>>a[i];//输入
                          sum+=a[i];//算所有数的和,用来计算平均值。
                      }
                  

                  求和并存储下n个数。

                  sum/=n;//肯定能整除,所以直接出就行了。
                  

                  求平均数。

                  接着计算并累加每个数距离平均数的差

                  //所以我在上面说你要把n个数存到数组里。
                  for(int i=1;i<=n;i++)
                  {
                      num+=abs(a[i],sum);//abs是一个函数,这个函数的功能是用来计算绝对值的。如果没想起来的话也可以自己编函数,绝对值的函数还是很好编的。这个函数在第一年讲过。
                  }
                  

                  现在我们的ans(所有数距离平均数的距离)已经计算好了,现在可以输出答案了。

                  cout<<num/2;//这个规律你自己按按计算器就能发现。abs(所有数,平均数)的和*2=移动多少草捆的数量。所以最后ans要除以2。
                  

                  头文件和定义数组不要落了,建议大家头文件写 #include <bits/stdc++.h> 因为上面我们说的abs函数在 algorithm 库中。

                  • 0
                    @ 2024-3-16 22:53:42

                    根据题目可知,干草堆可看成一个个数,我们要求平均数的差值,在循环时,我们给计数变量加上每一个数,如s+=a[i];之后,我们求平均值; 然后,我们遍历数组,求出每个差值,因为总数没变且正好满足平均数是整数,所以我们求出比平均值小的数比平均数差多少,并求出总和,就是答案了

                    • 0
                      @ 2024-2-6 22:57:29

                      保姆级的攻略来啦

                      #include<iostream>
                      int n,a[100001],sum,k,ans;//k为所有干草堆高度的平均数
                      using namespace std;
                      int main()
                      {
                          cin>>n;//输入n
                          for(int i=1;i<=n;i++)
                          {
                              cin>>a[i];
                              sum+=a[i];//输入所有干草堆的高度,并计算总和
                          }
                          k=sum/n;//计算k
                          for(int i=1;i<=n;i++)//循环遍历所有干草堆的高度
                          {
                              if(a[i]>k)
                              {
                                  ans+=a[i]-k;//计算所有高度>k的干草堆共需移出多少捆干草,即题目所求
                              }
                          }
                          cout<<ans;//输出ans
                          return 0;
                      }
                      
                      • 0
                        @ 2023-9-20 19:55:07
                        
                        

                        #include <bits/stdc++.h> using namespace std; int n, sum, a[10005]; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; sum += a[i]; } int d = sum / n; sum = 0; for (int i = 1; i <= n; i++) { if (a[i] > d) { sum += a[i] - d; } } cout << sum; return 0; }

                        
                        
                        • 0
                          @ 2023-9-20 19:53:55
                          
                          

                          #include <bits/stdc++.h> using namespace std; int n, sum, a[10005]; int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; sum += a[i]; } int d = sum / n; sum = 0; for (int i = 1; i <= n; i++) { if (a[i] > d) { sum += a[i] - d; } } cout << sum; return 0; }

                          
                          
                          • 0
                            @ 2023-8-3 19:32:38
                            #include <bits/stdc++.h>
                            using namespace std;
                            int a[10001],sum,num;
                            int main()
                            {
                                int n;
                                cin >> n;
                                for(int i = 1;i <= n;i++)
                                {
                                    cin >> a[i];
                                    sum += a[i];
                                }
                                sum /= n;
                                for(int i = 1;i <= n;i++)
                                {
                                    num += abs(sum - a[i]);
                                }
                                cout << num / 2;
                                return 0;
                            }
                            
                            
                            • 0
                              @ 2023-7-25 16:05:44

                              伪代码:

                              s=0,sd=0;
                              读取n
                              for{
                                  读取a[i]
                                  累加sd
                              }sd÷n
                              for{
                                  s+=|sd-a[i]|
                              }输出s
                              

                              翻译后:

                              int n,a[10001],s,sd;
                              int main(){
                                  cin>>n;
                                  for(int i=1;i<=n;i++){
                                      cin>>a[i];
                                      sd+=a[i];
                                  }
                                  sd=sd/n;
                                  for(int i=1;i<=n;i++)s+=abs(sd-a[i]);
                                  cout<<s/2;
                                  return 0;
                              }
                              

                              加上库就大功告成了

                              • 0
                                @ 2023-7-8 14:54:47
                                #include <bits/stdc++.h>
                                using namespace std;
                                int a[10001],sum,num;
                                int main()
                                {
                                    int n;
                                    cin >> n;
                                    for(int i = 1;i <= n;i++)
                                    {
                                        cin >> a[i];
                                        sum += a[i];
                                    }
                                    sum /= n;
                                    for(int i = 1;i <= n;i++)
                                    {
                                        num += abs(sum - a[i]);
                                    }
                                    cout << num / 2;
                                    return 0;
                                }
                                
                                • 0
                                  @ 2023-4-24 18:48:55

                                  思路:逐一比较每个与平均值的大小 //hetao593512

                                  • -1
                                    @ 2023-9-20 19:55:26
                                    #include <bits/stdc++.h>
                                    using namespace std;
                                    int n, sum, a[10005];
                                    int main()
                                    {
                                        cin >> n;
                                        for (int i = 1; i <= n; i++)
                                        {
                                            cin >> a[i];
                                            sum += a[i];
                                        }
                                        int d = sum / n;
                                        sum = 0;
                                        for (int i = 1; i <= n; i++)
                                        {
                                            if (a[i] > d)
                                            {
                                                sum += a[i] - d;
                                            }
                                        }
                                        cout << sum;
                                        return 0;
                                    }
                                    
                                    • -1
                                      @ 2023-9-3 15:13:08

                                      yasuo👀️

                                      补充一下,ans/2是因为如果前面的加上了,后面的就会减少,这是相对应的,所以要除2

                                      #include <iostream>
                                      int main(){
                                          int n,a[10005],pinj=0,ans=0; std::cin>>n; for(int i=0;i<n;i++){std::cin>>a[i]; pinj+=a[i];}
                                          pinj/=n; for(int i=0;i<n;i++)ans+=abs(pinj-a[i]); std::cout<<ans/2; return 0;}
                                      

                                      信息

                                      ID
                                      16
                                      时间
                                      1000ms
                                      内存
                                      256MiB
                                      难度
                                      3
                                      标签
                                      递交数
                                      1786
                                      已通过
                                      1024
                                      上传者