codeforces1849 D. Array Painting
题目链接
https://codeforces.com/problemset/problem/1849/D
题意
输入 \(n(1 \leq n \leq 2e5)\) 和长为 \(n\) 的数组 \(a(0 \leq a[i] \leq 2)\)。
最初,数组的每个元素都是蓝色的。
有两种类型的操作:
- 支付一枚硬币,选择一个蓝色元素,将其涂成红色。
- 选择一个不等于 \(0\) 的红色元素和与其相邻的蓝色元素,将红色元素的数值减少 \(1\),然后将蓝色元素涂成红色。
把每个元素都涂成红色,最少要支付多少金币?
题解
先假设初始化\(a[i]\),此时我们需要支付一个金币,随后可以将其变为红色。
若\(a[i] == 0\),明显无法进行更多操作
若\(a[i] == 1\),可以选择一个相邻的蓝色元素染为红色,并且自身数字减少 \(1\)
若\(a[i] == 2\),可以选择两个相邻的蓝色元素染为红色,并且自身数字减少 \(2\)
其中最特殊的自然是0,因为\(0\)要么被一个相邻的非 \(0\) 红色元素染红,要么只能直接花费一个金币染红
贪心的思路自然是尽量使用相邻的非 \(0\) 染红,因为可以尽量少使用金币
那么思路自然是先找出一个连续非零子数组,然后再去染相邻的蓝色 \(0\)
但是先找出一个非 \(0\) 串,再去染相邻的 \(0\),显然是有点麻烦的
不妨做出如下等价转换:
将数组从左往右观察,既然一个非\(0\)连续子数组可以染红一个\(0\),那么计算的数量 其实等于那些\(0\)的个数
既然如此,干脆直接从左往右计算\(0\)的个数,然后当遇到第一个连续非\(0\)子数组的时候,那个连续非\(0\)子数组都可以免费染红
如果那一串非\(0\)子数组里面全\(1\),那说明他只染了他前面那一大串\(0\)的最后一个\(0\)的位置,后面他连着的数字就不能再染,例如 \(0001110\),显然最后那个\(0\) 我们是染不到了。但是如果那个串里面有个\(2\),那么就连最后的那个\(0\)也能染了,例如 \(00021110\)。
然后什么时候一串全\(1\)子数组也能染后面的\(0\)呢?就是他前面没有任何未被染色的\(0\)的时候。举个例子,比如\(1110\),代价为\(1\),比如\(0201110\),代价为\(2\)。
参考代码
#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;
}
codeforces1849 D. Array Painting的更多相关文章
- CF1479B Painting the Array(贪心+DP)
题目大意:给你一个序列,让你提取出一个子序列A,剩余的部分组成子序列B,现定义seg(x)表示把序列x中相邻的相同数合并成一个数后,序列x的长度,分别求seg(A)+seg(B)的最大值和最小值,n= ...
- CF448C Painting Fence (分治递归)
Codeforces Round #256 (Div. 2) C C. Painting Fence time limit per test 1 second memory limit per tes ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- ES5对Array增强的9个API
为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...
- JavaScript Array对象
介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- 关于面试题 Array.indexof() 方法的实现及思考
这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...
- javascript之活灵活现的Array
前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...
- 5.2 Array类型的方法汇总
所有对象都具有toString(),toLocaleString(),valueOf()方法. 1.数组转化为字符串 toString(),toLocaleString() ,数组调用这些方法,则返回 ...
- OpenGL ES: Array Texture初体验
[TOC] Array Texture这个东西的意思是,一个纹理对象,可以存储不止一张图片信息,就是说是是一个数组,每个元素都是一张图片.这样免了频繁地去切换当前需要bind的纹理,而且可以节省系统资 ...
随机推荐
- ModbusRTU通信协议报文剖析
前言 大家好!我是付工.前面给大家介绍了Modbus协议的应用层面.终于有人把Modbus说明白了那么,今天跟大家聊聊关于Modbus协议报文的那些事. 一.真实案例 前段时间有个粉丝朋友,让我帮他解 ...
- Java项目笔记(一)
一.springboot控制台打印sql日志 ---------.mapper为你启动类扫描的mapper路径 logging.level.---------.mapper = debug 二.前端传 ...
- usb请求块以及提交方式
URB结构体 struct urb { /* private: usb core and host controller only fields in the urb */ struct kref k ...
- 2022年6月中国数据库排行榜:TiDB卷土重来摘桂冠,达梦蛰伏五月夺探花
排行榜风云又起,各产品墨坛论剑.2022年6月的 中国数据库流行度排行榜 再掀风云,6月排行榜共有231个数据库参与排名,两名新成员的加入,注入了新活力.本月排行榜用一句话可以概括为:TiDB卷土重来 ...
- element表单校验 【登录】
async btnOK () { // 1. 表单校验 (调用表单的校验方法获取校验结果) // this.$refs.formRef.validate(function (valid) { // c ...
- 将Vscode添加右键打开文件夹功能
1. wan + r 输入 regedit 打开注册表 注册表编辑 2. 找到 HKEY_CLASSES_ROOT\*\shell分支 3. 在shell下新建"VisualCode&quo ...
- ASP.NET实现网站发布及跨域访问
1.软件下载及安装 visual studio 2012 or 2013 启用电脑IIS配置 2.网页编写及排版 在visual studio中创建web项目添加aspx页面(个人网页:和html差不 ...
- Acrobat DC安装报错1603,Microsoft Visual C++2013(x64)失败
之前顺利安装过Acrobat DC,但可能因为自动更新了,导致让我重新登录才能使用,无法再次破解.于是我卸载后重新安装,发现提示Microsoft Visual C++2013(x64)运行安装失败. ...
- 云原生爱好者周刊:Dapr 成为 CNCF 孵化项目
云原生一周动态要闻: Dapr 加入 CNCF 孵化器 Knative 1.0 发布 Canonical 开始提供针对 Intel CPU 优化的 Ubuntu 图像 Longhorn 为 CNCF ...
- error loading sources list: ('The read operation timed out',)解决办法!!
一.灵魂四问 1.为什么叫rosdepc? rosdepc,c指的是China中国,主要用于和rosdep区分. 2.rosdepc和rosdep功能一致吗? rosdep官方最新版源码直接修改的,小 ...