题目描述
有一个含n字节的连续内存区域可能存在问题,工程师手中有一种检查软件,软件每次运行可以检查一段连续内存区间。由于检查的区间长度越长,要花费的时间就越多,因此工程师希望能够在运行最多m次程序的情况下,每次检查的区间长度最大值最小,且检查的区间的并集包含了所有出现的"1"。现给出内存的情况(0代表该字节不需要检查,1代表该字节需要检查),求最小的区间最大长度。
输入 第一行为一个正整数T(T<=25)表示有T组数据。 接下来每组数据中,第一行为两个正整数n,m(n<=100000,m<=n),表示内存总长n个字节,检查软件运行的次数上限m。 第二行为一个长度为n的01串,表示待检查的内存区域的情况。0代表不需要检查,1代表需要检查。 |
样例输入 2 |
输出 对于每组数据,输出一行"Case %: A",其中%表示第几组数据,A表示该组数据的答案。 |
样例输出 Case 1: 2 |
时间限制C/C++语言:1000MS其它语言:3000MS |
内存限制C/C++语言:65536KB其它语言:589824KB |
#include <iostream>
#include <string>
using namespace std;
int main () {
int T;
cin>>T;
for (int cnt=1; cnt<=T; cnt++){
int n,m;
cin>>n>>m;
string str;
cin>>str;
int result=n/m+1;
for (int len=n/m+1; len>=1; len--){
int count=m;
int i=0;
while(i<n){
if (str[i]=='1'){
i=i+len;
count--;
}
else {
i=i+1;
}
}
if (count>=0)
result=len;
if (count==m){
result=0;
break;
}
}
cout<<"Case "<<cnt<<": "<<result<<endl;
}
return 0;
}