【蓝桥杯集训·每日一题2025】 AcWing 5438. 密接牛追踪2 python

devtools/2025/2/28 6:14:24/



5438. 密接牛追踪2

Week 2
2月26日


题目描述


农夫约翰有 N N N 头奶牛排成一排,从左到右依次编号为 1 ∼ N 1 \sim N 1N

不幸的是,有一种传染病正在蔓延。

最开始时,只有一部分奶牛受到感染。

每经过一个晚上,受感染的牛就会将病毒传染给它左右两侧的牛(如果有的话)。

一旦奶牛被感染,它就会一直被感染,无法自愈。

给定一个经过若干个夜晚后的奶牛的整体状态,其中哪些奶牛已经被感染,哪些奶牛尚未被感染统统已知。

请你计算,最开始时就受到感染的奶牛的最小可能数量。

输入格式

第一行包含整数 N N N

第二行包含一个长度为 N N N 01 01 01 序列,用来表示给定的奶牛的整体状态,其中第 i i i 个字符如果是 1 1 1 则表示第 i i i 头奶牛已经被感染,如果是 0 0 0 则表示第 i i i 头奶牛尚未被感染。

输出格式

一个整数,表示最开始时就受到感染的奶牛的最小可能数量。

数据范围

1 ≤ N ≤ 3 × 1 0 5 1 \le N \le 3 \times 10^5 1N3×105

输入样例1:
5
11111
输出样例1:
1
样例1解释

初始时,任意一头奶牛被感染,一定天数后都可以使得所有奶牛被感染。

输入样例2:
6
011101
输出样例2:
4
样例2解释

唯一一种可能是给定状态是没有经过任何夜晚时所有奶牛的状态,所以输入中被感染的 4 4 4 头奶牛都在最开始时就受到感染。


实现code

python">import mathn = int(input())
s = input()
a = []
day = float('inf')
i = 0
while i < n:if s[i] == '0':i += 1continueelse:j = i + 1while j < n and s[j] == '1':j += 1len = j - ia.append(len)res = (len - 1) // 2if i == 0 or j == n:res = len - 1day = min(res, day)i = jans = 0
for i in a:ans += math.ceil(i / (2 * day + 1))
print(ans)



要解决这个问题,我们需要找到一种方法来确定在最开始时被感染的奶牛的最小数量。我们可以通过分析给定的01序列来推断出最初被感染的奶牛的位置。

问题分析

  1. 感染传播规则:每经过一个晚上,受感染的奶牛会将其左右两侧的奶牛感染(如果有的话)。
  2. 目标:给定一个经过若干夜晚后的感染状态,找到最初被感染的奶牛的最小数量。

解题思路

  1. 分段处理:将连续的1(被感染的奶牛)分成若干段,每一段代表一个连续的感染区域。
  2. 计算最小初始感染数:对于每一段连续的1,计算在最开始时需要有多少头奶牛被感染才能达到当前的感染状态。
  3. 合并结果:将所有段的初始感染数相加,得到最终的最小初始感染数。

具体步骤

  1. 遍历序列:遍历给定的01序列,找到所有连续的1的段。
  2. 计算每段的初始感染数:对于每一段连续的1,计算在最开始时需要有多少头奶牛被感染才能达到当前的感染状态。这个可以通过计算每段的长度和传播的天数来确定。
  3. 累加结果:将所有段的初始感染数相加,得到最终的最小初始感染数。
python">import mathn = int(input())
s = input()# 存储每一段连续1的长度
a = []
# 初始化最小天数为无穷大
day = float('inf')i = 0
while i < n:if s[i] == '0':i += 1continueelse:j = i + 1while j < n and s[j] == '1':j += 1length = j - ia.append(length)# 计算当前段的最小初始感染数res = (length - 1) // 2if i == 0 or j == n:res = length - 1day = min(res, day)i = j# 计算最终的最小初始感染数
ans = 0
for length in a:ans += math.ceil(length / (2 * day + 1))print(ans)

代码解释

  1. 遍历序列:通过while循环遍历序列,找到所有连续的1的段,并记录每段的长度。
  2. 计算最小初始感染数:对于每一段连续的1,计算在最开始时需要有多少头奶牛被感染。这个计算基于每段的长度和传播的天数。
  3. 累加结果:将所有段的初始感染数相加,得到最终的最小初始感染数。

示例

  • 输入1

    5
    11111
    

    输出1

    1
    

    解释:任意一头奶牛被感染,经过一定天数后都可以使得所有奶牛被感染。

  • 输入2

    6
    011101
    

    输出2

    4
    

    解释:唯一一种可能是给定状态是没有经过任何夜晚时所有奶牛的状态,所以输入中被感染的4头奶牛都在最开始时就受到感染。

通过这种方法,我们可以有效地计算出最初被感染的奶牛的最小数量。


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


http://www.ppmy.cn/devtools/163279.html

相关文章

Visual Studio更新说明(关注:.NET+AI生产力)

Ver V0.0&#xff1a;Visual Studio 2022 v17.12更新:.NET9AI生产力 AI插件推荐 &#xff08;1&#xff09;腾讯云AI代码手&#xff08;内含了DeepSeek-R1&#xff09;&#xff0c;目前免费&#xff0c;但收费我也可能会买。 AI插件!推荐 &#xff08;1&#xff09;百度的…

销售易NeoCRM与八骏科技CRM:全方位深度对比

在当今竞争激烈的CRM市场中&#xff0c;销售易NeoCRM和八骏科技CRM作为国内知名的CRM解决方案&#xff0c;各自拥有独特的优势和特点。本文将从功能、用户体验、价格、市场评价以及适用场景等方面对这两款CRM系统进行对比总结和盘点。 一、功能对比 销售易NeoCRM&#xff1a;…

嵌入式硬件篇---常用的汇编语言指令

文章目录 前言汇编语言简介1. 数据传送指令MOVPUSHPOPXCHG 2. 算术运算指令ADDSUBMULDIVINCDEC 3. 逻辑运算指令ANDORXORNOTSHL/SHR 4. 控制转移指令JMPCALLRETJE/JZJNE/JNZJG/JNLEJL/JNGE 5. 比较与测试指令CMPTEST 6. 标志寄存器操作指令STCCLCSTDCLD 7. 字符串操作指令MOVSL…

康威生命游戏

通过二维卷积快速计算每个细胞的Moore型邻居存活数&#xff08;8邻域&#xff09; import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from scipy.signal import convolve2d import time import logginglogging.basicConfi…

Spring 核心技术解析【纯干货版】- XIV:Spring 消息模块 Spring-Jms 模块精讲

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;MQ&#xff09;扮演着至关重要的角色&#xff0c;它不仅能够解耦系统各个模块&#xff0c;还能提升系统的可扩展性和可靠性。JMS&#xff08;Java Message Service&#xff09;作为 Java EE 规范中…

Spring MVC视图解析器的定制与应用

Spring MVC视图解析器的定制与应用 在Spring MVC框架中&#xff0c;视图解析器&#xff08;ViewResolver&#xff09;是一个非常重要的组件&#xff0c;它负责将控制器返回的逻辑视图名称解析为实际的视图资源。通过自定义视图解析器&#xff0c;我们可以灵活地控制视图的渲染…

阿里巴巴DIN模型原理与Python实现

阿里巴巴的 Deep Interest Network (DIN) 是一种用于点击率预测&#xff08;CTR&#xff09;的深度学习模型&#xff0c;特别针对电商场景中用户兴趣多样化和动态变化的特性设计。其核心思想是通过 注意力机制 动态捕捉用户历史行为中与当前候选商品相关的兴趣。 1.DIN 模型原理…

如何下载MinGW-w64到MATLAB

MinGW 的全称是&#xff1a;Minimalist GNU on Windows 。它是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下&#xff0c;并且包含了 Win32API &#xff0c;因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的&#xff0c…