解题思路

  1. 首先判断是否可以平分:

    • 计算玩具总数
    • 检查是否能被小朋友数量整除
  2. 如果可以平分:

    • 计算每个小朋友应得的玩具数量
    • 计算每个小朋友需要增减的玩具数量
    • 由于每次只能移动2个玩具,需要检查差值的奇偶性
  3. 计算最少移动次数:

    • 统计所有正差值的总和
    • 由于每次移动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()

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度:,其中 为小朋友数量
  • 空间复杂度:,用于存储玩具数量数组