针对CSP-J/S的每日一练:Day 8

一、审题

题目描述

小明正在玩一个游戏。游戏中有一个长度为 n n n 的序列,每个位置上有一个数字。现在,小明可以进行若干次操作,每次操作可以选择一个位置上的数字 x x x,并将其加上 1 1 1 或减去 1 1 1,即将它变成 x + 1 x+1 x+1 x − 1 x-1 x1。小明希望进行若干次操作之后,序列中所有数字都相等,你可以输出小明需要进行的最少操作次数。

输入格式

输入的第一行包含一个整数 n n n,表示序列的长度。
接下来一行包含 n n n 个整数 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,,an,表示序列中每个位置上的数字。

输出格式

输出一个整数,表示小明需要进行的最少操作次数。

数据范围

1 ≤ n ≤ 100 1≤n≤100 1n100
1 ≤ a i ≤ 100 1≤a_i≤100 1ai100

样例1

输入

4
1 2 3 4

输出

4

样例2

输入

3
1 100 1

输出

98

来源

2019 CSP-J 第1题

二、思路

若干次操作后要使所有数字相等,显然需要将所有数变成它们的平均数。

如果平均数不是整数,需要先将所有数变化到最接近平均数的整数,然后再把它们变成平均数。变化到最接近平均数的整数不会超过0.5次操作。

如果平均数是整数,则只需要将每个数变化到平均数即可。

三、代码实现

#include <iostream>
using namespace std;
const int N = 110;
int n;
int a[N];

int main()
{
   cin >> n;

   int sum = 0;
   for (int i = 0; i < n; i++)
   {
       cin >> a[i];
       sum += a[i];
   }
   int avg = sum / n;

   int res = 0;
   for (int i = 0; i < n; i++)
   {
       res += abs(a[i] - avg);
   }

   if (sum % n != 0)
   {
       int cnt1 = 0, cnt2 = 0;
       for (int i = 0; i < n; i++)
       {
           if (a[i] < avg)
           {
               cnt1 += avg - a[i];
           }
           else if (a[i] > avg + 1)
           {
               cnt2 += a[i] - avg - 1;
           }
       }
       res += min(cnt1, cnt2);
   }

   cout << res / 2 << endl;
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值