1 条题解

  • 0
    @ 2025-10-27 0:42:00

    🎨 用积木游戏理解平衡元素

    1. 把数组想象成一排积木

    [2] [3] [5] [8]
     1   2   3   4   ← 位置编号
    

    2. 两种颜色的积木

    • 🔵 蓝色积木 = 偶数
    • 🔴 红色积木 = 奇数
    🔵 🔴 🔴 🔵
     2   3   5   8
    

    3. 平衡规则就像"好朋友手拉手"

    规则1:两端的积木

    第一个积木:只需要右边的好朋友是蓝色
    [🔵] ← [🔵]  ✓ 开心
    [🔵] ← [🔴]  ✗ 不开心
    
    最后一个积木:只需要左边的好朋友是蓝色
    [🔵] → [🔵]  ✓ 开心
    [🔴] → [🔵]  ✗ 不开心
    

    规则2:中间的积木

    中间积木:左右两个好朋友必须颜色相同
    [🔵] ← [🔵] → [🔵]  ✓ 开心(蓝+蓝=偶数)
    [🔴] ← [🔵] → [🔴]  ✓ 开心(红+红=偶数)
    [🔵] ← [🔵] → [🔴]  ✗ 不开心(蓝+红=奇数)
    

    4. 两种让所有积木开心的模式

    模式1:所有积木都是蓝色朋友

    🔵 🔵 🔵 🔵
     2 → 4 → 6 → 8
    

    检查:

    • 第一个:右边是🔵 ✓
    • 第二个:左边🔵+右边🔵 ✓
    • 第三个:左边🔵+右边🔵 ✓
    • 第四个:左边是🔵 ✓

    模式2:蓝色和红色交替

    🔴 🔵 🔴 🔵
     1 → 2 → 3 → 4
    

    检查:

    • 第一个:右边是🔵 ✓
    • 第二个:左边🔴+右边🔴 ✓(红+红=偶数)
    • 第三个:左边🔵+右边🔵 ✓(蓝+蓝=偶数)
    • 第四个:左边是🔴 ✗ 不开心!

    5. 发现秘密规律!

    通过玩积木游戏,我们发现:

    当积木数量是偶数时:

    只能选择模式1:全部蓝色
    🔵 🔵 🔵 🔵
    

    当积木数量是奇数时:

    可以选择:
    模式1:全部蓝色 🔵 🔵 🔵 🔵 🔵
    或者
    模式2:蓝红交替 🔴 🔵 🔴 🔵 🔴
    

    6. 操作就像"涂颜色"

    每次操作就像给积木涂一次颜色:

    • 红色→蓝色:涂1次
    • 蓝色→红色:涂1次
    • 颜色不变:涂0次

    我们的目标: 用最少的涂色次数,让所有积木都开心!

    7. 实际例子

    例子1: [2, 3, 5, 8] = 🔵 🔴 🔴 🔵

    • 模式1成本:🔴→🔵(1次) + 🔴→🔵(1次) = 2次
    • 模式2成本:🔵→🔴(1次) + 🔴→🔵(1次) + 🔴→🔴(0次) + 🔵→🔴(1次) = 3次
    • 最少:2次

    例子2: [3, 4, 5, 6, 7] = 🔴 🔵 🔴 🔵 🔴

    • 模式1成本:5个🔴→🔵 = 5次
    • 模式2成本:已经是完美模式 = 0次
    • 最少:0次

    🎯 总结

    1. 把数字变成彩色积木(蓝色=偶数,红色=奇数)
    2. 让每个积木都开心(检查好朋友的颜色)
    3. 找到最省力的涂色方法(计算最少操作次数)
    4. 记住秘密:积木数量是偶数时只能全蓝,奇数时可以选全蓝或蓝红交替

    题解代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int arr[100005];
    
    int main() {
        int n;
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> arr[i];
        }
        
        int cost1 = 0, cost2 = 0;
        
        // 模式1:全偶数
        for (int i = 0; i < n; i++) {
            cost1 += arr[i] % 2;
        }
        
        // 模式2:只有n为奇数时考虑
        if (n % 2 == 1) {
            for (int i = 0; i < n; i++) {
                if (i % 2 == 0) {  // 偶数索引应为奇数
                    cost2 += (arr[i] % 2 == 0);  // 如果是偶数需要操作
                } else {  // 奇数索引应为偶数
                    cost2 += (arr[i] % 2 == 1);  // 如果是奇数需要操作
                }
            }
        } else {
            cost2 = n + 1;  // 确保大于最大可能成本
        }
        
        cout << min(cost1, cost2) << endl;
        return 0;
    }
    

    信息

    ID
    5588
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    12
    已通过
    1
    上传者