[百度]内存检查

题目描述
									

有一个含n字节的连续内存区域可能存在问题,工程师手中有一种检查软件,软件每次运行可以检查一段连续内存区间。由于检查的区间长度越长,要花费的时间就越多,因此工程师希望能够在运行最多m次程序的情况下,每次检查的区间长度最大值最小,且检查的区间的并集包含了所有出现的"1"。现给出内存的情况(0代表该字节不需要检查,1代表该字节需要检查),求最小的区间最大长度。

输入

第一行为一个正整数T(T<=25)表示有T组数据。

接下来每组数据中,第一行为两个正整数n,m(n<=100000,m<=n),表示内存总长n个字节,检查软件运行的次数上限m。

第二行为一个长度为n的01串,表示待检查的内存区域的情况。0代表不需要检查,1代表需要检查。

样例输入

2
7 3
1100101
3 1
101

输出

对于每组数据,输出一行"Case %: A",其中%表示第几组数据,A表示该组数据的答案。

样例输出

Case 1: 2
Case 2: 3

时间限制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;
}

猜你喜欢

转载自blog.csdn.net/xiaocong1990/article/details/82912735