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();
}
相关推荐
筏.k7 分钟前
动态规划之 “完全背包“ ------P8646 [蓝桥杯 2017 省 AB] 包子凑数
算法·蓝桥杯·动态规划
promising-w40 分钟前
【蓝桥杯单片机】第十二届省赛
单片机·嵌入式硬件·蓝桥杯
X_StarX4 小时前
计算机基础面试(数据结构)
数据结构·面试·职场和发展
倔强的石头1064 小时前
【C++经典例题】字符串特定规则反转问题的解法
算法·leetcode·职场和发展
_GR6 小时前
2016年蓝桥杯第七届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯
screamn6 小时前
蓝桥杯 - 每日打卡(类斐波那契循环数)
java·职场和发展·蓝桥杯
我不是彭于晏丶6 小时前
蓝桥杯 过年【算法赛】
算法·职场和发展·蓝桥杯
大萌神Nagato8 小时前
补题蓝桥杯14届JavaB组第4题
蓝桥杯
萧毅寒16 小时前
leetcode第40题组合总和Ⅱ
算法·leetcode·职场和发展
BingLin-Liu16 小时前
蓝桥杯备考:DFS之选数问题
职场和发展·蓝桥杯·深度优先