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();
}
相关推荐
yaoh.wang2 小时前
力扣(LeetCode) 27: 移除元素 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
牛客企业服务3 小时前
AI面试监考:破解在线面试作弊难题
人工智能·面试·职场和发展
LYFlied4 小时前
【每日算法】LeetCode 46. 全排列
前端·算法·leetcode·面试·职场和发展
LYFlied5 小时前
【每日算法】131. 分割回文串
前端·数据结构·算法·leetcode·面试·职场和发展
LYFlied7 小时前
【每日算法】LeetCode 78. 子集
数据结构·算法·leetcode·面试·职场和发展
LinHenrY12277 小时前
初识C语言(编译和链接)
c语言·开发语言·蓝桥杯
_OP_CHEN7 小时前
【算法基础篇】(三十五)图论基础之最小生成树:从原理到实战,彻底吃透 Prim 与 Kruskal 算法
算法·蓝桥杯·图论·最小生成树·kruskal算法·prim算法·acm/icpc
LYFlied7 小时前
【算法解题模板】-【回溯】----“试错式”问题解决利器
前端·数据结构·算法·leetcode·面试·职场和发展
资深web全栈开发9 小时前
LeetCode 3652: 按策略买卖股票的最佳时机
算法·leetcode·职场和发展
渡过晚枫9 小时前
[蓝桥杯/java/算法]攻击次数
java·算法·蓝桥杯