AcWing 蓝桥杯集训·每日一题2025·密接牛追踪2

密接牛追踪2

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

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

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

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

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

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

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

输入格式

第一行包含整数 N。

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

输出格式

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

输入样例

复制代码
5
11111

输出样例

复制代码
4

题意 : 给定01字符串, 求最开始时, 01串中含1的数量,每天01串中的1都会扩散扩散方式如下:

  • 每天 1 会向俩端扩展,知道全部 0 变为 1 为止

解题思路:

将扩散转换为区间问题, 查找最大天数, 因为每个1 每天的扩展区间为 2r + 1 其中 r 为天数, 可以用一个变量cnt统计出每段去间1的数量, 然后套用公式计算出最大天数, 根据最大天数, 计算该段 1 的连续区间最少的 1 的数量。

AC Code

cpp 复制代码
// Problem: 密接牛追踪2
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/5441/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
typedef long long ll; // 确保 ll 在使用前被定义
using namespace std;
using i64 = long long;
#define f for(int i = 0; i < n;++i)
#define ff for(int i = 1; i <= n;++i)
#define int long long 
#define pii pair<int,int>
#define In \
		ll n; \
		std::cin >> n;\

const int mod = 1e9 + 7, N = 1e7;

void solve(){
	In; std::string s;std::cin >> s;
	int ans = 0;
	std::vector<pii> ss;
	// 遍历每段区间, 将每段区间记录
	for(int i = 0, j = 0; i < n; i = j) {
		while(s[i] == '0') i++;
		j = i;
		while(j < n and s[j] == '1') j++;
		if(j > i) ss.push_back({i , j - 1});
	}
	
	if(ss.size() == 0) {
		std::cout << 0 << "\n";
		return ;
	}
	
	// 计算最小天数
	int R = 1e9;
	for(auto &[l , r] : ss) {
		// 最后和首位要特判
		if(l == 0 or r == n - 1) R = std::min(r - l + 1, R);
		else R = min((r - l + 2) / 2, R);
	}
	
	// 最后根据答案计算最小感染牛
	for(auto &[l, r] : ss) {
		ans += (r - l) / (2 * R - 1) + 1;
	}
	std::cout << ans << "\n";
}

signed main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0); std::cout.tie(0);
	ll T = 1;
	//std::cin >> T;
	for(int i = 1; i <= T; ++i) solve();
}
相关推荐
每次的天空7 小时前
Android第十三次面试总结基础
android·面试·职场和发展
珂朵莉MM9 小时前
2021 RoboCom 世界机器人开发者大赛-高职组(初赛)解题报告 | 珂学家
java·开发语言·人工智能·算法·职场和发展·机器人
前端小崔10 小时前
前端面试题之ES6保姆级教程
开发语言·前端·javascript·面试·职场和发展·ecmascript·es6
互联网杂货铺1 天前
完美搭建appium自动化环境
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
鑫鑫向栄1 天前
[蓝桥杯]修改数组
数据结构·c++·算法·蓝桥杯·动态规划
鑫鑫向栄1 天前
[蓝桥杯]带分数
数据结构·c++·算法·职场和发展·蓝桥杯
枷锁—sha1 天前
护网行动面试试题(2)
web安全·面试·职场和发展