1 条题解
-
0
🎨 用积木游戏理解平衡元素
1. 把数组想象成一排积木
[2] [3] [5] [8] 1 2 3 4 ← 位置编号2. 两种颜色的积木
- 🔵 蓝色积木 = 偶数
- 🔴 红色积木 = 奇数
🔵 🔴 🔴 🔵 2 3 5 83. 平衡规则就像"好朋友手拉手"
规则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次
🎯 总结
- 把数字变成彩色积木(蓝色=偶数,红色=奇数)
- 让每个积木都开心(检查好朋友的颜色)
- 找到最省力的涂色方法(计算最少操作次数)
- 记住秘密:积木数量是偶数时只能全蓝,奇数时可以选全蓝或蓝红交替
题解代码:
#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; }
- 1
信息
- ID
- 5588
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 12
- 已通过
- 1
- 上传者