牛客周赛Round 80——举手赢棋 python 补题 + 题解

文章目录

  • 前言
  • 举手赢棋easy
  • 举手赢棋hard


前言


紧跟时事的两道算法题
牛客周赛 Round 80


举手赢棋easy


题目描述

本题为《举手赢棋hard》的简单版本,两题的唯一区别在于对举手次数的限制不同,在本题中,小红有1次举手的机会。

小红获得了参加鹿瓜杯的资格,在赛前,她预测了接下来的几场比赛,使用一个仅由‘0’和‘1’构成的字符串s表示。其中,Si=‘0’代表第i场比赛会失利,Si=‘1’代表第i场比赛会胜利。
为了胜利,小红希望任意时刻自己的胜场不低于负场。因此,小红有1次通过"举手"强行获得一场比赛胜利的机会(即将字符串的任意一位修改为‘1’)。
请你帮小红计算有多少种安排这1次举手的方案。

一个合法的方案需要满足:恰好有1局是举手的,且任意时刻胜场数量不小于负场数量。
请注意,小红在预测胜场的局也可以选择举手。

输入描述:

第一行输入一个正整数n(2≤n≤1e5)代表比赛场数。
第二行输入一个长度为n、仅由‘0’和‘1’构成的字符串s。其中,Si=‘0’代表在不举手的情况下,第i场比赛会失利,Si=‘1’代表在不举手的情况下,第i场比赛会胜利。

输出描述:

输出一个整数,代表有多少种安排这1次举手的方案。

示例1
输入:

7
0100000

输出:

0

解释:
在这个样例中,无论小红怎么举手,都无法挽回口碑。因为即使在最开始举手,也无法避免后续的负场超过胜场。

示例2
输入:

5
10110

输出:

5

解释:
在这个样例中,任意选择一场举手均可。因为在任意一场比赛举手都不会导致负场超过胜场。

示例3
输入:

5
01110

输出:

1


思路分析

  1. 问题建模
  • 给定一个长度为n的字符串s,由’0’和’1’组成,表示比赛结果。
  • '0’表示失败,'1’表示胜利。
  • 我们有1次机会将任意一个’0’变为’1’(即“举手”)。
  • 目标是保证任意时刻胜场数量不低于负场数量,并计算满足条件的方案数。
  1. 前缀和的概念
    我们可以使用前缀和来跟踪当前的胜负情况:
  • 将每个’1’视为+1,每个’0’视为-1。
  • 前缀和pre_sum[i]表示从第1场到第i场比赛的累计得分(即胜场减去负场的数量)。

如果在某一点i,前缀和pre_sum[i]小于0,则意味着在这一点上负场超过了胜场,需要通过举手来调整。

  1. 关键点分析
  • 如果整个序列的最小前缀和都大于等于0,说明不需要任何举手操作即可满足条件,输出所有可能的举手位置数,即n
  • 如果最小前缀和小于-2,则无论如何举手都无法使胜场数量始终不低于负场数量,直接输出0。
  • 否则,我们需要找到需要举手的位置,并计算所有合法的举手方案。

具体步骤

  1. 初始化前缀和

    • pre_sum[i]:记录从第1场到第i场比赛的累计得分。
  2. 判断是否无需举手

    • 如果所有前缀和都非负,说明不需要任何举手操作即可满足条件,输出所有可能的举手位置数,即n
  3. 判断是否无法满足条件

    • 如果最小前缀和小于-2,说明无论如何举手都无法使胜场数量始终不低于负场数量,直接输出0。
  4. 寻找需要举手的位置

    • 找到第一个前缀和小于0的位置pos
  5. 计算合法方案数

    • 遍历前pos个位置,如果在这些位置上是失败(即a[i] == -1),则举手可以使得前缀和变为非负,从而增加一种合法的方案数。


code实现与注释

n = int(input()) 
s = input()       
# 将字符串s转换为列表a,其中胜利记为1,失败记为-1
a = [int(x) if x == '1' else -1 for x in s]# 初始化前缀和数组pre_sum
pre_sum = [0] * (n + 1)
for i in range(1, n + 1):pre_sum[i] = pre_sum[i - 1] + a[i - 1]# 如果所有前缀和都非负,说明不需要任何举手操作即可满足条件
if min(pre_sum[1:]) >= 0:print(n)  # 如果最小前缀和小于-2,说明无论如何举手都无法使胜场数量始终不低于负场数量
elif min(pre_sum[1:]) < -2:print(0)else:ans = 0  pos = -1  # 记录需要第一次举手的位置# 找到第一个前缀和小于0的位置posfor i in range(1, n + 1):if pre_sum[i] < 0:pos = ibreakfor i in range(pos):if a[i] == -1:  ans += 1  # 在这些位置举手可以使前缀和变为非负print(ans)


举手赢棋hard


题目描述

本题为《举手赢棋easy》的困难版本,两题的唯一区别在于对举手次数的限制不同,在本题中,小红有2次举手的机会。

小红获得了参加鹿瓜杯的资格,在赛前,她预测了接下来的n场比赛,使用一个仅由‘0’和‘1’构成的字符串s表示。其中,si=‘0’代表第i场比赛会失利,Si=‘1’代表第i场比赛会胜利.

为了胜利,小红希望任意时刻自己的胜场不低于负场。因此,小红有2次通过“举手”强行获得一场比赛胜利的机会(即将字符串的任意一位修改为‘1’)。
请你帮小红计算有多少种安排这2次举手的方案。

一个合法的方案需要满足:恰好有2局是举手的,且任意时刻胜场数量不小于负场数量。
请注意,小红在预测胜场的局也可以选择举手。

输入描述:

第一行输入一个正整数n(2≤n≤1e5)代表比赛场数。
第二行输入一个长度为n、仅由‘0’和‘1’构成的字符串S。其中,Si=‘0’代表在不举手的情况下,第i场比赛会失利,Si=‘1’代表在不举手的情况下,第i场比赛会胜利。

输出描述:

输出一个整数,代表有多少种安排这2次举手的方案。

示例1

输入:

7
0100000

输出:

0

解释:
在这个样例中,无论小红怎么举手,都无法挽回口碑。

示例2
输入:

5
10110

输出:

10

解释:
在这个样例中,任意选择两场举手均可。

示例3
输入:

5
01000

输出:

3

说明

在这个样例中,有以下三种可行的方案:

  • 选择第一局、第三局举手;
  • 选择第一局、第四局举手;
  • 选择第一局、第五局举手。

这道题的题目要求是在给定的比赛序列中,通过最多两次“举手”(即将某个’0’变为’1’)使得任意时刻胜场数量不低于负场数量。我们需要计算所有可能的合法方案数。

思路分析

1. 问题建模

  • 给定一个长度为n的字符串s,由’0’和’1’组成,表示比赛结果。
  • '0’表示失败,'1’表示胜利。
  • 我们有2次机会将任意一个’0’变为’1’(即“举手”)。
  • 目标是保证任意时刻胜场数量不低于负场数量,并计算满足条件的方案数。
  1. 前缀和的概念
    我们可以使用前缀和来跟踪当前的胜负情况:
  • 将每个’1’视为+1,每个’0’视为-1。
  • 前缀和pre_sum[i]表示从第1场到第i场比赛的累计得分。

如果在某一点i,前缀和pre_sum[i]小于0,则意味着在这一点上负场超过了胜场,需要通过举手来调整。

  1. 关键点分析
  • 如果整个序列的最小前缀和都大于等于0,那么不需要任何举手操作,直接输出所有组合数C(n, 2)
  • 如果最小前缀和小于-4,则无论如何举手都无法使胜场数量始终不低于负场数量,直接输出0。
  • 否则,我们需要找到需要举手的位置,并计算所有合法的举手方案。

具体步骤

  1. 初始化前缀和和失败次数

    • pre_sum[i]:记录从第1场到第i场比赛的累计得分。
    • cnt0[i]:记录前缀中’0’的个数。
  2. 判断是否无需举手

    • 如果所有前缀和都非负,说明不需要任何举手操作即可满足条件,输出所有可能的组合数C(n, 2)
  3. 判断是否无法满足条件

    • 如果最小前缀和小于-4,说明无论如何举手都无法使胜场数量始终不低于负场数量,直接输出0。
  4. 寻找需要举手的位置

    • 找到第一个前缀和小于0的位置pos1
    • 找到第一个前缀和小于-2的位置pos2
  5. 计算合法方案数

    • 如果只需要一次举手即可满足条件,则第二次举手可以任意选择。
    • 如果需要两次举手,则根据前缀和的变化情况计算符合条件的方案数。

题解code:

n = int(input())
s = input()
# 将字符串s转换为一个列表a,其中胜利记为1,失败记为-1
a = [int(x) if x == '1' else -1 for x in s]pre_sum = [0] * (n + 1)  # 前缀和数组,记录从第0场到当前场次的累计得分
cnt0 = [0] * (n + 1)     # 记录前缀中失败('0')的个数for i in range(1, n + 1):cnt0[i] = cnt0[i - 1] + (a[i - 1] == -1)  # 更新失败次数pre_sum[i] = pre_sum[i - 1] + a[i - 1]    # 更新前缀和# 如果所有前缀和都非负,说明不需要任何举手操作即可满足条件
if min(pre_sum[1:]) >= 0:print(n * (n - 1) // 2)  # 输出所有可能的组合数C(n, 2)# 如果最小前缀和小于-4,说明无论如何举手(两次)都无法使胜场数量始终不低于负场数量
elif min(pre_sum[1:]) < -4:print(0)else:ans = 0pos1, pos2 = -1, -1  # 记录需要第一次和第二次举手的位置# 找到第一个前缀和小于0的位置pos1for i in range(1, n + 1):if pre_sum[i] < 0:pos1 = ibreak# 找到第一个前缀和小于-2的位置pos2for i in range(pos1, n + 1):if pre_sum[i] < -2:pos2 = ibreak# 如果只需要一次举手即可满足条件,则第二次举手可以任意选择if pos2 == -1:for i in range(pos1):if a[i] == -1:ans += n - i + i - cnt0[i + 1]else:  # 需要两次举手for i in range(pos1):if a[i] == -1:ans += cnt0[pos2] - cnt0[i + 1]  # 第二次举手在【i,pos2】print(ans)



END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是矩阵账号?如何做矩阵账号运营?

在当今数字化浪潮中&#xff0c;无论是跨境电商、内容创作还是品牌推广&#xff0c;矩阵账号运营已成为企业与个人实现快速增长的关键策略。本文将深入探讨矩阵账号运营的核心要素&#xff0c;包括铺量策略、多账号管理、引流技巧以及如何应对运营中的常见问题&#xff0c;助力…

SpringCloud - Sentinel服务保护

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://sentinelguard.io/zh-cn/index.h…

文件和内容管理:非结构化数据的有序化

在数据管理的众多领域中&#xff0c;文件和内容管理专注于处理非结构化数据&#xff0c;如文档、图像、音频和视频等。这些数据虽然不像结构化数据那样易于管理和分析&#xff0c;但它们在组织的日常运营中扮演着不可或缺的角色。今天&#xff0c;让我们深入《DAMA数据管理知识…

2025/2/10 心得

第一题。J. C - Grand Garden (AI) 问题陈述 在一个花坛里&#xff0c;有 NN 朵花&#xff0c;编号为 1,2,\ldots,N1,2,…,N。最初&#xff0c;所有花的高度都是 00。你将得到一个高度序列 h{h\_1,h\_2,h\_3,\ldots\} 作为输入。你希望通过重复以下“浇水”操作来将所有花的编…

集成右键的好用软件,支持多线程操作!

今天给大家分享一个超级实用的小工具&#xff0c;真的能帮上大忙呢&#xff01;这个软件是吾爱大神无知灰灰精心制作的&#xff0c;简直就是图片转换界的“小能手”。 它能一键把webp格式的图片转换成png格式&#xff0c;而且速度超快&#xff0c;完全不输那些付费的软件&#…

UPDATE 语句结合 REPLACE() 函数来批量修改 detail 字段中的 xxx 为 xxx

问题出现的背景&#xff0c;由于阿里云的oss服务器域名更换&#xff0c;所以我们需要修改数据库中detail字段中的域名&#xff0c;才能加载图片 您可以使用 SQL 的 UPDATE 语句结合 REPLACE() 函数来批量修改 detail 字段中的 oss.kxlist.com 为 www.crossbiog.com。 以下是 S…

【设计模式】【行为型模式】职责链模式(Chain of Responsibility)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f4eb; 欢迎V&#xff1a; flzjcsg2&#xff0c;我们共同讨论Java深渊的奥秘 &#x1f…

Visual Studio踩过的坑

统计Unity项目代码行数 编辑-查找和替换-在文件中查找 查找内容输入 b*[^:b#/].*$ 勾选“使用正则表达式” 文件类型留空 也有网友做了指定&#xff0c;供参考 !*\bin\*;!*\obj\*;!*\.*\*!*.meta;!*.prefab;!*.unity 打开Unity的项目 注意&#xff1a;只是看&#xff0…

云原生后端|实践?

云原生&#xff08;Cloud Native&#xff09;是一种构建和运行应用程序的方法&#xff0c;它充分利用云计算的优势&#xff0c;包括弹性、可扩展性、高可用性和自动化运维。云原生后端开发通常涉及微服务架构、容器化、持续集成/持续部署&#xff08;CI/CD&#xff09;、服务网…

《深度学习》——pytorch框架及项目

文章目录 pytorch特点基本概念 项目项目实现导入所需库下载训练数据和测试数据对训练和测试样本进行分批次展示手写图片判断pytorch是否支持GPU定义神经网络模型定义训练函数定义测试函数创建交叉熵损失函数和优化器通过多轮训练降低损失值得到最终结果注意 pytorch PyTorch 是…

深入探索人工智能的未来:DeepSeek R1与蓝耘智算平台的完美结合

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车&#xff0c;从精准医疗到金融风险预测&#xff0c;AI的应用无处不在。深度学习作为AI的核…

Qt最新热点

Qt的最新热点主要集中在以下几个方面: 跨平台开发:Qt继续强调其在跨平台开发方面的优势,支持在Windows、macOS、Linux以及移动操作系统(如Android和iOS)上的应用开发。 Qt for Python:Qt for Python(PySide2和PySide6)的发展,为Python开发者提供了更强大的工具来创建桌…

基于uniapp vue3 的滑动抢单组件

通过在onMounted获取movable-area与movable-view实例&#xff0c;计算出可滑动的距离 效果图&#xff1a; 代码&#xff1a; <template><view class"slider-container"><movable-area class"movable-area" id"movableArea">…

亚博microros小车-原生ubuntu支持系列:26手势控制小车基础运动

背景知识 手指检测&#xff1a;亚博microros小车-原生ubuntu支持系列&#xff1a;4-手部检测-CSDN博客 程序功能说明 功能开启后&#xff0c;摄像头捕获图像&#xff0c;识别手势来控制小车移动。 手势 “5”小车前进拳头小车后退手势 “1”小车向左手势 “2”小车向右 运…

在人工智能领域 ⊕、⊗和 ⊙ 符号是什么含义?

我们经常在论文中看到 ⊕、⊗和 ⊙ 符号&#xff0c;那么有下面两个问题&#xff1a; 这三个符号有什么作用呢&#xff1f; 如何在论文中正确使用这三个数学符号 1. 两种符号的解释 1.1 逐元素相加&#xff1a;⊕ ⊕ 在论文中表示逐元素相加&#xff0c;如果用两个矩阵表示&a…

NineData云原生智能数据管理平台新功能发布|2025年1月版

本月发布 14 项更新&#xff0c;其中重点发布 6 项、功能优化 7 项、安全性更新 1 项。 重点发布 数据库 Devops - 数据导出功能增强 支持 AWS ElastiCache 数据源&#xff1a;现已支持通过 SQL 查询语句或直接通过库表导出 AWS ElastiCache 数据&#xff0c;方便用户快速提取…

蓝桥与力扣刷题(226 翻转二叉树)

题目&#xff1a;给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,…

C# OpenCV机器视觉:OSTU算法实现背景差分的自适应分割

在一个热闹的科技公司里&#xff0c;阿强是一个负责图像分析的员工。他的日常工作就是从各种复杂的图像中提取出有用的信息&#xff0c;可这可不是一件轻松的事情哦 最近&#xff0c;阿强接到了一个艰巨的任务&#xff1a;要从一堆嘈杂的监控图像中分离出运动的物体&#xff0c…

amis组件crud使用踩坑

crud注意 过滤条件参数同步地址栏 默认 CRUD 会将过滤条件参数同步至浏览器地址栏中&#xff0c;比如搜索条件、当前页数&#xff0c;这也做的目的是刷新页面的时候还能进入之前的分页。 但也会导致地址栏中的参数数据合并到顶层的数据链中&#xff0c;例如&#xff1a;自动…

解决 ollama._types.ResponseError 问题

原因 在对问题进行分析后&#xff0c;我认为原因是之前为了在服务器上下载模型&#xff0c;我设置了启动时自动配置的网络代理。然而&#xff0c;ollama在运行时采用了该代理配置&#xff0c;而不是默认的API URL&#xff08;“http://localhost:11434”&#xff09;。因此&am…