题目链接

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的更多相关文章

  1. CF1479B Painting the Array(贪心+DP)

    题目大意:给你一个序列,让你提取出一个子序列A,剩余的部分组成子序列B,现定义seg(x)表示把序列x中相邻的相同数合并成一个数后,序列x的长度,分别求seg(A)+seg(B)的最大值和最小值,n= ...

  2. CF448C Painting Fence (分治递归)

    Codeforces Round #256 (Div. 2) C C. Painting Fence time limit per test 1 second memory limit per tes ...

  3. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  4. ES5对Array增强的9个API

    为了更方便的对Array进行操作,ES5规范在Array的原型上新增了9个方法,分别是forEach.filter.map.reduce.reduceRight.some.every.indexOf ...

  5. JavaScript Array对象

    介绍Js的Array 数组对象. 目录 1. 介绍:介绍 Array 数组对象的说明.定义方式以及属性. 2. 实例方法:介绍 Array 对象的实例方法:concat.every.filter.fo ...

  6. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  7. 关于面试题 Array.indexof() 方法的实现及思考

    这是我在面试大公司时碰到的一个笔试题,当时自己云里雾里的胡写了一番,回头也曾思考过,最终没实现也就不了了之了. 昨天看到有网友说面试中也碰到过这个问题,我就重新思考了这个问题的实现方法. 对于想进大公 ...

  8. javascript之活灵活现的Array

    前言 就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用. 大家都知道Array实例有这四个方法:push.pop.shift.unshift.大家也都知道 pus ...

  9. 5.2 Array类型的方法汇总

    所有对象都具有toString(),toLocaleString(),valueOf()方法. 1.数组转化为字符串 toString(),toLocaleString() ,数组调用这些方法,则返回 ...

  10. OpenGL ES: Array Texture初体验

    [TOC] Array Texture这个东西的意思是,一个纹理对象,可以存储不止一张图片信息,就是说是是一个数组,每个元素都是一张图片.这样免了频繁地去切换当前需要bind的纹理,而且可以节省系统资 ...

随机推荐

  1. JAVAEE——MySQL安装

    一.下载MySQL(两种方式) 1.官网下载 官网下载地址:https://www.mysql.com/downloads   2.点击下载(版本:mysql-8.0.28-winx64) 链接:ht ...

  2. SpringMVC —— 入门案例执行流程

    启动服务器初始化过程 1.服务器启动,执行ServletContainersInitConfig类,初始化web容器    2.执行createServletApplicationContext方法, ...

  3. 【赵渝强老师】MongoDB的inMemory存储引擎

    一.MongoDB的存储引擎概述 存储引擎(Storage Engine)是MongoDB的核心组件,负责管理数据如何存储在硬盘(Disk)和内存(Memory)上.从MongoDB 3.2 版本开始 ...

  4. LeetCode 730. Count Different Palindromic Subsequences (区间DP)

    题意 给一个字符串S,求它所有子序列中不同非空回文串的数量.字符串由 'a' 'b' 'c' 'd' 四个字母组成. 由于题目要求的是不同回文串. abba 的回文串子序列为 a,b,aba,abba ...

  5. 29. GIL全局解释器锁、信号量、线程池进程池

    1. GIL全局解释器锁 1.1 概念 '''In CPython, the global interpreter lock, or GIL, is a mutex that prevents mul ...

  6. Android Qcom USB Driver学习(一)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) USB接口类型 Android终端上常用的USB接口:TypeC(现在的主流),MicroB(以前的设备) ...

  7. AMBA总线架构简介

    于是乎,我们想到了总线,用一个统一的接口协议,设计出一个符合要求的总线,然后将ARM核和各种外设模块挂载在总线上,这样,命令和数据似乎便可以在CPU和外设之间自由穿梭. 1 AMBA总线 AMBA,英 ...

  8. Linux中ln 链接命令的用法

    ln的语法 Usage: ln [OPTION]... [-T] TARGET LINK_NAME (1st form) or: ln [OPTION]... TARGET (2nd form) or ...

  9. Effective C++:以const、enum和inline来替换define

    替换define,也就是"以编译器替换预处理器".#define是C语言里的利器,但在C++里有很多取代它的理由. define是预处理的一部分,而不是编译器的一部分,它在编译前就 ...

  10. 黑神话:悟空电脑太卡?配置不够?ToDesk云电脑入门新手教程

    许多玩家在玩<黑神话:悟空>时会遭遇硬件配置不足导致的游戏卡顿.画面不流畅等问题. 其实这个难题很好解决,用ToDesk云电脑即可迎刃而解.即使你的本地电脑配置不高,也能享受到流畅的游戏体 ...