Enduring Exodus CodeForces - 655C (二分)

本文探讨了一种算法问题,即如何将k头奶牛和一个人分配到k+1个空房间中,使得人与最远奶牛之间的距离最小。通过枚举和二分查找优化,实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接

大意: n个房间, 1为占用, 0为未占用, John要将k头奶牛和自己分进k+1个空房间, 求John距最远的奶牛距离的最小值

 

 

这种简单题卡了20min....

显然对于固定的k+1个房间, 只需要John在最接近中央的房间即可, 枚举每k个房间, 找出最接近的就行了

这样复杂度是$O(nlogk)$

还可以直接二分答案, 复杂度$O(nlogn)$

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;

const int N = 4e5+10;
int n, k;
int a[N];
char s[N];

int main() {
	scanf("%d%d%s", &n, &k, s+1);
	REP(i,1,n) if (s[i]=='0') a[++*a] = i;
	n = *a;
	int ans = 1e9;
	REP(i,1,n-k) {
		int j = i+k;
		int p = lower_bound(a+i,a+j+1,(a[i]+a[j])/2)-a-1;
		REP(r,p,p+3) if (i<=r&&r<=j) {
			ans = min(ans, max(abs(a[i]-a[r]),abs(a[j]-a[r])));
		}
	}
	printf("%d\n", ans);
}

 

转载于:https://www.cnblogs.com/uid001/p/10410673.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值