洛谷pP2708 硬币翻转

洛谷pP2708 硬币翻转

问题描述

给定长度为 $n$ 的 $01$ 串,定义一次操作为把一个区间 $[l,r]$ 内的 $0$ 变成 $1$,$1$ 变成 $0$。求最少操作次数使得 $01$ 串变成 $11\cdots 1$ 或者 $00\cdots 0$。

约定:

  • 区间 $[l,r]$ 指 $[l,r]$ 之间的字符,$1\leq l\leq r\leq n$。

输入格式

第一行一个整数 $n$,表示字符串长度。

第二行一个长度为 $n$ 的 $01$ 串。

输出格式

输出一个数,表示最少操作次数。

样例输入1

3
101

样例输出1

2

样例说明1

将区间 $[1,2]$ 翻转一次,将区间 $[2,3]$ 翻转一次。

样例输入2

5
11111

样例输出2

0

样例说明2

$01$ 串已经为 $11111$。

样例输入3

6
101010

样例输出3

3

样例说明3

将区间 $[2,3]$ 翻转一次,将区间 $[4,5]$ 翻转一次,将区间 $[6,6]$ 翻转一次。

思路分析

我们可以定义一个差异数组 $d$,用来记录 $01$ 串中每一个位置上的字符与目标串 $11\cdots 1$ 或者 $00\cdots 0$ 的字符差异。

最后问题被转化为将这个差异数组的和转换成 $0$ 的问题,因为每一次翻转操作都会将差异数组的和减少 $2\Delta$。

所以问题被转化为了求差异数组中连续的一些子区间,将其和转化成 $0$ 的问题,这个问题可以使用前缀和和哈希表优化求解。

代码实现

n = int(input())
s = input()

d = []
for i in range(n):
    if s[i] == '0':
        d.append(1)
    else:
        d.append(-1)

pre = [0] * (n + 1)
for i in range(n):
    pre[i + 1] = pre[i] + d[i]

cnt = {}
ans = 0
for i in range(n + 1):
    x = pre[i]
    ans += cnt.get(x, 0)
    cnt[x] = cnt.get(x, 0) + 1
print(ans)

总结

本文是对洛谷 pP2708 硬币翻转题目的一个详细解答,通过前缀和和哈希表的优化,实现了对该问题的高效求解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:洛谷pP2708 硬币翻转 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • Java类加载器ClassLoader的使用详解

    Java类加载器ClassLoader的使用详解 类加载器ClassLoader是Java虚拟机(JVM)中至关重要的一部分,它负责将字节码文件加载到JVM中并创建相应的Java对象。本文将详细介绍ClassLoader的使用方法。 什么是ClassLoader ClassLoader是Java中的一个内置类,负责将类文件(.class文件)装载到内存中,并…

    other 2023年6月25日
    00
  • 详解Spring 中 Bean 的生命周期

    下面我来详细讲解一下 Spring 中 Bean 的生命周期的完整攻略。 1. Bean 的生命周期概述 Bean 的生命周期可以被分为以下几个阶段: 实例化阶段:在容器中创建一个 Bean 的实例,一般是通过 Java 的反射机制实现; 属性赋值阶段:容器通过 setter 方法或者直接赋值,将 Bean 的属性值填充到 Bean 实例中; 初始化阶段:B…

    other 2023年6月27日
    00
  • vue全局引入scss(mixin)

    要在Vue中全局引入SCSS mixin,需要以下步骤: 1. 安装sass-loader和node-sass 在Vue项目中使用SCSS需要先安装sass-loader和node-sass两个依赖包。 npm install sass-loader node-sass -D 2. 在vue.config.js中配置 在Vue项目根目录下新建vue.conf…

    other 2023年6月27日
    00
  • Java 方法签名详解及实例代码

    Java 方法签名详解及实例代码攻略 什么是方法签名? 在Java中,方法签名是指唯一标识一个方法的相关信息,包括方法的名称、参数类型、以及返回值类型。方法签名的作用是确保方法的唯一性,并提供编译器和运行时环境进行方法的匹配和调用。 方法签名的组成部分 方法签名由方法名、参数列表和返回值类型组成。 以下是方法签名的一般结构: 返回值类型 方法名(参数列表) …

    other 2023年6月28日
    00
  • Android Parcelable接口使用方法详解

    首先介绍一下Parcelable接口,它是Android平台内部用于进程间通信(IPC)的一个轻量级序列化框架,相比较于Java自带的Serializable接口,Parcelable接口在性能方面有更好的表现。 一、实现Parcelable接口 要使用Parcelable接口,需要先实现它。具体实现过程如下所示: 1.在实体类中实现Parcelable接口…

    other 2023年6月27日
    00
  • Java程序部署到服务器上,接口请求下载文件失败/文件为空/文件名不对的问题

    部署Java程序到服务器上,接口请求下载文件失败、文件为空或文件名不对的问题,可能是由于以下原因造成的: 1.文件路径问题:在服务器上存储的文件路径与实际请求下载的路径不一致,导致找不到或文件名不对。解决方案是检查文件路径是否正确,并根据需要进行修改。 2.编码问题:在Java程序中,如果涉及到文件名或路径的处理,需要判断其编码方式,避免在不同平台上产生乱码…

    other 2023年6月26日
    00
  • android应用框架-volley网络通信框架

    以下是关于“Android应用框架-Volley网络通信框架”的完整攻略,包括定义、特点、使用方法、示例说明和注意事项。 定义 Volley是一款由Google开发的Android网络通信框架,可以帮助开发者快速、便地进行网络通信。Volley支持HTTP请求、图片加载、JSON解析等功能,具有高效、简单可定制等特点。 特点 Volley的特点包括: 高效:…

    other 2023年5月8日
    00
  • win10预览版9924下载地址 win10 9924官方下载

    Win10预览版9924下载攻略 Win10预览版9924是微软最新发布的操作系统版本,本攻略将详细介绍如何下载和安装该版本。以下是完整的攻略过程: 步骤一:访问微软官方网站 首先,打开你的浏览器,访问微软官方网站。你可以在地址栏输入https://www.microsoft.com来进入微软官方网站。 步骤二:导航到Windows 10预览版页面 在微软官…

    other 2023年8月3日
    00
合作推广
合作推广
分享本页
返回顶部