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的纹理,而且可以节省系统资 ...
随机推荐
- 系统编程-进程-当文件操作遇上fork
我的关联博文: 系统编程-进程-fork深度理解.vfork简介 系统编程-进程-先后fork或open一个文件的区别 test1: lseek基本使用 #include <stdio.h& ...
- 关于AutoCAD反复弹窗Nonvalid Software Detected的解决办法
事件起因: 客户安装的 CAD 2020 频繁弹窗Nonvalid Software Detected,报错内容:YOUR ACCESS IS NOW BLOCKED 解决办法: 在文件资源管理器 ...
- AE cc 2017 和 2018 中英文切换的方法
AE cc 2017中文切换英文的方法 找到AE的安装文件目录下的"Support Files"文件夹,路径为 C:\Program Files\Adobe\Adobe After ...
- mysql后台导入sql文件-设定字符集
需求描述:有一个user_info.sql 的文件里面都是插入user_info表的insert语句数据,数据量500M,要求快速插入mysql的数据库中. 解决方法: 1.利用客户端工具加载文件插入 ...
- SD卡的基本知识与选购指南
1.SD卡与TF卡 SD 卡:又叫标准 SD 卡,其尺寸大小为 32 x 24 x 2.1 mm ,一般用于数码相机.声卡和采集卡等设备. TF 卡:又叫 micro SD 卡,其尺寸大小为 15 x ...
- android ion
1. 简介 Android的ION子系统的目的主要是通过在硬件设备和用户空间之间分配和共享内存,实现设备之间零拷贝共享内存.说来简单,其实不易.在Soc硬件中,许多设备可以进行DMA,这些设备可能有不 ...
- day07-数据类型及标识符
数据类型 强类型语言 要求变量的使用严格要严格符合规定,所有变量都必须先定义后才能使用 弱类型语言 java的数据类型分为两大类 基本类型(primitive type) 数值类型 整数类型 byte ...
- R语言经典统计分析
经典统计分析包括了许多常用的统计方法和技术,用于数据的描述.推断和建模.本节将介绍经典统计分析方法(包括t检验.方差分析.卡方检验.线性回归)在R语言中的实现. 5.1.1 t检验 样本均值(sam ...
- 云原生周刊:Istio 1.20.0 发布 | 2023.11.20
开源项目推荐 DevPod DevPod 是一款纯客户端工具,可在任何后端基于 devcontainer.json 创建可重现的开发人员环境.每个开发者环境都在一个容器中运行,并通过 devconta ...
- 题解:P9784 [ROIR 2020 Day1] 超速
传送门 洛谷题解 思路 我们设 \(T\) 为所花的总时间,\(d\) 为超速多少. 然后不难知道 $ T = \sum_{i = 1}^{n} \frac{l_i}{v_i+d}$,所以我们实际上是 ...