洛谷pP2708 硬币翻转

yizhihongxing

洛谷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数据结构之二叉搜索树详解

    我为您详细讲解“Java数据结构之二叉搜索树详解”的完整攻略。 什么是二叉搜索树? 二叉搜索树(Binary Search Tree,简称BST)是一种特殊的二叉树,它的每个节点最多有两颗子树,左子树元素均小于当前节点元素,右子树元素均大于当前节点元素,左右子树都是二叉搜索树。 二叉搜索树的优点在于能够提供进行二分查找的能力,对于动态集合的数据操作,二叉搜索…

    other 2023年6月27日
    00
  • linux下解压war格式的包

    以下是Linux下解压war格式的包的完整攻略,包括以下内容: 概述 解压war格式的包的基本用法 示例说明 1. 概述 在Linux系统中,war格式的包是一种常见的Java Web应用程序打包格式。解压war格式的包可以查看其中的文件和目录结构,也可以修改其中的文件。本文将介绍如何在Linux系统中解压war格式的包。 2. 解压war格式的包的基本用法…

    other 2023年5月9日
    00
  • Windows Vista 简体中文32位正式版(MSDN)下载

    Windows Vista 简体中文32位正式版(MSDN)下载攻略 1. 确认系统要求 首先,确保你的计算机符合Windows Vista的最低系统要求。以下是Windows Vista的最低系统要求: 处理器:1 GHz 32位(x86)或64位(x64)处理器 内存:1 GB RAM(32位)或2 GB RAM(64位) 硬盘空间:16 GB可用空间(…

    other 2023年7月28日
    00
  • 图文实操详解前端处理小图标的那些解决方案

    图文实操详解前端处理小图标的那些解决方案 前言 在前端开发中,小图标是一个不可忽视的细节问题。处理好小图标的显示和交互可以提高用户体验和页面美观度。本文将详解前端处理小图标的完整攻略,介绍小图标的几种处理方法和相应的具体实现。 解决方案 方案一:Base64编码 Base64编码是一种将二进制数据转换成ASCII字符的方法,它可以将小图片转换成一段base6…

    other 2023年6月26日
    00
  • nuxt 路由、过渡特效、中间件的实现代码

    Nuxt 路由、过渡特效、中间件的实现代码攻略 Nuxt.js 简介 Nuxt.js 是一个基于 Vue.js 的通用应用框架,它可以帮助我们快速构建服务器渲染的 Vue.js 应用。Nuxt.js 提供了一些内置功能,包括路由、过渡特效和中间件,使得开发过程更加简单和高效。 路由 Nuxt.js 使用 Vue Router 来实现路由功能。在 Nuxt.j…

    other 2023年7月28日
    00
  • Spring Cloud Gateway 默认的filter功能和执行顺序介绍

    让我给你讲解一下 Spring Cloud Gateway 默认的 filter 功能和执行顺序。 简介 Spring Cloud Gateway 是一个基于 Spring Boot 2.x 的网关服务,它提供了许多强大的特性,其中就包括了 filter 功能。filter (过滤器)是 Spring Cloud Gateway 提供的一个可以在请求路由之前…

    other 2023年6月27日
    00
  • 谈谈newthread的弊端及java四种线程池的使用

    谈谈 NewThread 的弊端及 Java 四种线程池的使用 作为一个开发者,我们经常需要使用多线程来提高程序的效率。在 Java 中,我们可以通过调用 new Thread() 来创建一个新的线程。但是,直接使用 new Thread() 会有一些弊端。本文将介绍 new Thread() 的弊端,并介绍 Java 中的四种线程池及其使用方法。 NewT…

    其他 2023年3月28日
    00
  • vue数组内的去重

    下面是关于“Vue数组内的去重”的完整攻略: 1. 问题描述 在Vue开发中,我们经常需要对数组进行去重操作。那么,如何在Vue中对数组进行去重呢? 2. 解决方法 在Vue中,可以使用JavaScript的Set对象对数组进行去重。Set对象是一种集合,其中的元素是唯一的,不会重复。以下是两个示例说明: 示例1:使用Set对象对数组进行去重 // 定义一个…

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