题意:给你一个二进制表示是否可以吃巧克力。一共有k个巧克力,第一天和最后一天必须吃。最小化每两次吃巧克力的最大间隔?
标程:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int read() 4 { 5 char ch=getchar(); 6 while (ch<'0'||ch>'9') ch=getchar(); 7 while ('0'<=ch&&ch<='9') return ch-'0'; 8 } 9 const int N=200005; 10 int n,k,a[N],head,pos,l,r,ans,num; 11 bool check(int x) 12 { 13 head=pos=1;num=0; 14 for (int i=1;i<n;i++) 15 { 16 if (!a[i]) pos=i; 17 if (i==head+x+1) { 18 if (pos==head) return 0; 19 head=pos;num++; 20 } 21 } 22 return num+2<=k; 23 } 24 int main() 25 { 26 scanf("%d%d",&n,&k); 27 for (int i=1;i<=n;i++) a[i]=read(); 28 l=0;r=n; 29 while (l<=r) 30 { 31 int mid=(l+r)>>1; 32 if (check(mid)) ans=mid,r=mid-1;else l=mid+1; 33 } 34 printf("%d ",ans); 35 return 0; 36 }
题解:二分答案
易错点:注意第一天和最后一天必须吃,特判一下。