题目:给你一个01字符串,定义答案=该串中最长的连续1的长度,现在你有至多K次机会,每次机会可以将串中的某个0改成1,现在问最大的可能答案
输入描述:
输入第一行两个整数N,K,表示字符串长度和机会次数 第二行输入N个整数,表示该字符串的元素( 1 <= N <= 300000, 0 <= K <= N )
输出描述:
输出一行表示答案。
输入例子1:
10 2 1 0 0 1 0 1 0 1 0 1
输出例子1:
5
分析:后面有时间再补。
Show me the code:
// by 阮的名
#include <vector>
#include <string>
#include <sstream>
#include <iostream>
#include <queue>
using namespace std;
void split(const string &s, char sep, vector<int> &ret) {
stringstream ss(s);
string item;
while(getline(ss, item, sep)) {
stringstream ss2(item);
int tmp;
ss2 >> tmp;
ret.emplace_back(tmp);
}
}
class Solution {
public:
Solution(vector<int> s, int k):m_s(std::move(s)),m_k(k) {
for(unsigned int i=0;i<m_s.size();i++) {
if(m_s[i]==0)
m_zeroPos.emplace_back(i);
}
}
int fillMax() {
if(m_zeroPos.size()<m_k)
return m_s.size();
unsigned int start = 0;
unsigned int end = start+m_k;
int max = 0 ;
while(start!=(m_zeroPos.size()-m_k+1)) {
int tmp = count(start, end);
max = max>tmp?max:tmp;
start++;
end++;
}
return max;
}
int count(unsigned int start, unsigned int end) {
int s_start = 0;
if(start)
s_start = m_zeroPos[start-1]+1;
int s_end = m_zeroPos[end];
if(end>=m_zeroPos.size())
s_end = m_s.size()-1;
return s_end-s_start;
}
private:
vector<int> m_s;
deque<int> m_zeroPos;
int m_k;
};
int main() {
string input;
getline(cin, input);
vector<int> parameter;
split(input, ' ', parameter);
int N = parameter[0];
int K = parameter[1];
vector<int> bitArray;
bitArray.reserve(N);
getline(cin, input);
split(input, ' ', bitArray);
Solution s(bitArray, K);
cout << s.fillMax() << endl;
}