解题思路
-
首先判断是否可以平分:
- 计算玩具总数
- 检查是否能被小朋友数量整除
-
如果可以平分:
- 计算每个小朋友应得的玩具数量
- 计算每个小朋友需要增减的玩具数量
- 由于每次只能移动2个玩具,需要检查差值的奇偶性
-
计算最少移动次数:
- 统计所有正差值的总和
- 由于每次移动2个玩具,结果为正差值和除以2
代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int M;
cin >> M;
vector<int> toys(M);
int total = 0;
// 读取输入并计算总和
for(int i = 0; i < M; i++) {
cin >> toys[i];
total += toys[i];
}
// 判断是否可以平分
if(total % M != 0) {
cout << -1 << endl;
return 0;
}
int avg = total / M;
int diff = 0;
// 计算需要移动的玩具数量
for(int i = 0; i < M; i++) {
if(toys[i] > avg) {
if((toys[i] - avg) % 2 != 0) {
cout << -1 << endl;
return 0;
}
diff += toys[i] - avg;
}
}
// 输出结果
cout << diff / 2 << endl;
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt();
int[] toys = new int[M];
int total = 0;
// 读取输入并计算总和
for(int i = 0; i < M; i++) {
toys[i] = sc.nextInt();
total += toys[i];
}
// 判断是否可以平分
if(total % M != 0) {
System.out.println(-1);
return;
}
int avg = total / M;
int diff = 0;
// 计算需要移动的玩具数量
for(int i = 0; i < M; i++) {
if(toys[i] > avg) {
if((toys[i] - avg) % 2 != 0) {
System.out.println(-1);
return;
}
diff += toys[i] - avg;
}
}
// 输出结果
System.out.println(diff / 2);
}
}
def solve():
M = int(input())
toys = list(map(int, input().split()))
# 计算总和并判断是否可以平分
total = sum(toys)
if total % M != 0:
print(-1)
return
avg = total // M
diff = 0
# 计算需要移动的玩具数量
for toy in toys:
if toy > avg:
# 检查差值是否为偶数
if (toy - avg) % 2 != 0:
print(-1)
return
diff += toy - avg
# 输出结果
print(diff // 2)
if __name__ == "__main__":
solve()
算法及复杂度
- 算法:贪心算法
- 时间复杂度:,其中 为小朋友数量
- 空间复杂度:,用于存储玩具数量数组