您的位置:首页 > 新闻 > 会展 > 网站建设与制作实验报告_公众号开发需要哪些技术_搜索引擎优化理解_seo网页优化公司

网站建设与制作实验报告_公众号开发需要哪些技术_搜索引擎优化理解_seo网页优化公司

2025/3/13 22:06:48 来源:https://blog.csdn.net/2401_87245677/article/details/145865182  浏览:    关键词:网站建设与制作实验报告_公众号开发需要哪些技术_搜索引擎优化理解_seo网页优化公司
网站建设与制作实验报告_公众号开发需要哪些技术_搜索引擎优化理解_seo网页优化公司



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

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. 累加结果:将所有段的初始感染数相加,得到最终的最小初始感染数。
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
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com