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

文章讲解了如何通过编程实现,将序列中的数字调整至相同值,涉及操作次数计算及平均数应用。

一、审题

题目描述

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

输入格式

输入的第一行包含一个整数 nnn,表示序列的长度。
接下来一行包含 nnn 个整数 a1,a2,…,ana_1,a_2,…,a_na1,a2,,an,表示序列中每个位置上的数字。

输出格式

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

数据范围

1≤n≤1001≤n≤1001n100
1≤ai≤1001≤a_i≤1001ai100

样例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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值