一、审题
题目描述
小明正在玩一个游戏。游戏中有一个长度为 nnn 的序列,每个位置上有一个数字。现在,小明可以进行若干次操作,每次操作可以选择一个位置上的数字 xxx,并将其加上 111 或减去 111,即将它变成 x+1x+1x+1 或 x−1x-1x−1。小明希望进行若干次操作之后,序列中所有数字都相等,你可以输出小明需要进行的最少操作次数。
输入格式
输入的第一行包含一个整数 nnn,表示序列的长度。
接下来一行包含 nnn 个整数 a1,a2,…,ana_1,a_2,…,a_na1,a2,…,an,表示序列中每个位置上的数字。
输出格式
输出一个整数,表示小明需要进行的最少操作次数。
数据范围
1≤n≤1001≤n≤1001≤n≤100
1≤ai≤1001≤a_i≤1001≤ai≤100
样例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; }
文章讲解了如何通过编程实现,将序列中的数字调整至相同值,涉及操作次数计算及平均数应用。
431

被折叠的 条评论
为什么被折叠?



