题目描述 Description
在幻想乡, 比那名居天子是管理着『要石』的人。能够引发和镇压地震存在幻想乡, 比
那名居天子是管理着『要石』的人。能够引发和镇压地震存当然也可以用来改变地形。
因为在幻想乡引发震,而被灵梦等人教训了之后天子不 得使用『要石』来修复地面。幻
想乡可以视为 长度为 N个格子的一条横轴 ,其中有些格子的土 地由于震被破坏 (记为
1) ,有 些格子则没(记为 0) 。每次使用『要石』,可以把 。每次使用『要石』,可以把
一段长度 为 L的格子全部修复完成 的格子全部修复完成 的格子全部修复完成 的格子全
部修复完成 的格子全部修复完成 (即将 1变为 0,L覆盖的范围可以超出地图 ),当然 L越
大,使用 时所花费的灵力也就越多。天子希望 最多使用 K次『要石』就将所有被破坏的
土地 全部修复 完成 (即将 1全部变为 0) ,并且花费尽可能小的 灵力。她想知道够达到
这个目,并且花费尽可能小的 灵力。她想知道够达到这个目L最小 是多少。
输入描述 Input Description
输入格式
第 1行: 2个整数, N, K
第 2行: 1个 01 串,长度为 N
输出描述 Output Description
输出格式 第 1行: 1个整数, L的最小值
样例输入 Sample Input
输入样例
10 3
0101111011
样例输出 Sample Output
输出样例
3
数据范围
N<=K<=500000
思路:二分
题解:
#include<iostream>
#include<cstdio>
using namespace std;
char a[600000];
int n,k;
bool check(int l)
{
int i=1;
int sum=0;
while(i<=n)
{
if(a[i]=='1')
{
i=i+l;
sum++;
if(sum>k)
{
return 0;
}
}
else
{
i++;
}
}
return 1;
}
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",a+1);
int l=1,r=n;
int ans=10000000;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid))
{
r=mid-1;
ans=min(ans,mid);
}
else
{
l=mid+1;
}
}
printf("%d",ans);
return 0;
}