【等价转换】codeforces1849 D. Array Painting
题目链接
https://codeforces.com/problemset/problem/1849/D
题意
输入
最初,数组的每个元素都是蓝色的。
有两种类型的操作:
- 支付一枚硬币,选择一个蓝色元素,将其涂成红色。
- 选择一个不等于
的红色元素和与其相邻的蓝色元素,将红色元素的数值减少 ,然后将蓝色元素涂成红色。
把每个元素都涂成红色,最少要支付多少金币?
题解
先假设初始化
若
若
若
其中最特殊的自然是0,因为
贪心的思路自然是尽量使用相邻的非
那么思路自然是先找出一个连续非零子数组,然后再去染相邻的蓝色
但是先找出一个非
不妨做出如下等价转换:
将数组从左往右观察,既然一个非
既然如此,干脆直接从左往右计算
如果那一串非
然后什么时候一串全
参考代码
#include<bits/stdc++.h> #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; int n, m; int a[200007]; int main() { IOS cin >> n; for (int i{0}; i < n; ++ i) { cin >> a[i]; } for (int i{0}, j{0}; i < n; ) { if (a[i] == 0) { j = 1; ++ m; ++ i; } else { if (!j) { ++ m; } bool flag = false; while (i < n && a[i] > 0) { if (a[i] == 2) flag = true; ++ i; } if (flag || j == 0) ++ i; j = 0; } } cout << m << '\n'; return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 【.NET】调用本地 Deepseek 模型