题目链接:http://codeforces.com/problemset/problem/645/C
题意:给你n个房间, 0代表空房子, 1代表非空的房子, 一个农夫和他的k个牛要住进空房子里面,i房子和j房子的距离是|j-i| 问农夫约翰和他的最远的牛的最小值是多少?
思路:这一题是求最大值的最小值,是一道很明显的二分的题。所以,我们可以枚举每一个空的房间,二分找出农夫住这个房间时与他最远的奶牛的最小值,然后每次更新这个最小值便是答案。最关键的就是这个二分的过程怎么写。对于每一个点,我们可以二分距离,如果这个距离符合题意,我们就可以把这个距离记下来,并令r=mid-1,反之,我们就让l=mid+1。然后用得到的距离来更新答案即可。
具体操作请看代码。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65#include<iostream> #include<cstdio> using namespace std; const int maxn=1e5+7; int sum[maxn]; char a[maxn]; int n,k; bool check(int i,int dist) { int l=max(1,i-dist); int r=min(n,i+dist); if(sum[r]-sum[l-1]>=k+1) return true; else return false; } int Search(int i) { int imin; int l=1,r=n; while(l<=r) { int mid=(l+r)/2; if(check(i,mid)) { imin=mid; r=mid-1; } else { l=mid+1; } } return imin; } int main() { while(~scanf("%d%d",&n,&k)) { scanf("%s",a+1); sum[0]=0; for(int i=1; i<=n; i++) { if(a[i]=='0') sum[i]=sum[i-1]+1; else sum[i]=sum[i-1]; } int ans=n; for(int i=1; i<=n; i++) { if(a[i]=='0') { ans=min(ans,Search(i)); } } printf("%dn",ans); } return 0; }
最后
以上就是温柔洋葱最近收集整理的关于CodeForces - 645C Enduring Exodus(二分)的全部内容,更多相关CodeForces内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复