给一个长度为 n 的正整数序列 { � 1 , � 2 , … , � � a 1 ,a 2 ,…,a n },每次操作可以选择两个相邻的位 置,让一个元素 -1 另一个元素 +1,输出最少几次操作,能让所有元素相等, 如果不可能实现,请输出 "-1",不含引号。c++解决代码
时间: 2024-03-20 07:41:32 浏览: 43
可以通过以下 C++ 代码实现:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
int sum = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
}
if (sum % n != 0) {
cout << "-1" << endl; // 无法实现
return 0;
}
int avg = sum / n;
int ans = 0;
for (int i = 0; i < n; i++) {
ans += abs(a[i] - avg); // 统计最小操作次数
}
cout << ans / 2 << endl;
return 0;
}
```
首先读入长度为 n 的正整数序列,然后计算它们的总和 sum。如果 sum 不能被 n 整除,说明无法通过操作使得所有元素相等,输出 "-1"。否则,计算平均值 avg,然后遍历序列中的每个元素,统计它们与平均值之差的绝对值,最后除以 2 得到最小操作次数即为所求答案。
相关问题
判断一个整数 a � 能否被另一个整数 b � 整除。
如果一个整数a能够被另一个整数b整除,那么a对b取模的结果应该是0。因此,可以使用取模运算符(%)来判断a是否能够被b整除。具体实现如下:
```
if a % b == 0:
print("a可以被b整除")
else:
print("a不能被b整除")
```
其中,"=="表示相等的判断,如果a对b取模的结果等于0,即a能够被b整除,则输出"a可以被b整除",否则输出"a不能被b整除"。
给定一个由 � n 个整数构成的序列 � 1 , � 2 , … , � � a 1 ,a 2 ,…,a n ,你需要对它进行如下操作: 输入格式 1 x y,表示把所有 � � � a kx ( � k 为正整数, � � ≤ � kx≤n)都加上 � y。 输入格式 2 x y,表示把所有 � � � a kx ( � k 为正整数, � � ≤ � kx≤n)都减去 � y。 输入格式 3 j,表示输出 � � a j 。
这个问题可以使用数组来存储序列,然后根据输入的不同操作进行修改或输出。具体实现如下:
```python
n = int(input())
a = list(map(int, input().split()))
while True:
op = input().split()
if op[0] == '1':
x, y = map(int, op[1:])
for i in range(1, n+1):
if i % x == 0:
a[i-1] += y
elif op[0] == '2':
x, y = map(int, op[1:])
for i in range(1, n+1):
if i % x == 0:
a[i-1] -= y
elif op[0] == '3':
j = int(op[1])
print(a[j-1])
else:
break
```
其中,`a` 是存储序列的数组,`op` 是输入的操作,`op[0]` 表示操作类型。如果是操作类型为 1,表示加上某个数,就遍历整个序列,找到对应位置进行修改;如果是操作类型为 2,表示减去某个数,同样也要遍历整个序列进行修改;如果是操作类型为 3,表示输出某个位置的数,直接输出即可。当输入不再是操作时,退出循环。