nozomi和字符串
https://ac.nowcoder.com/acm/contest/3002/H
字符串,贪心
分为两种情况处理:1->0 0->1
分别记录0和1的位置,然后只更改0或1(都改岂不是白浪费2次?)
距离为 所更改的第一个1之前的一个1所在位置+1,
到第k个1之后的一个1所在位置-1,之间的距离。
所以一开始vector直接push_back(-1)和最后一步push_back(n)
字符串位置是从 0到n-1
-1+1=0 n-1=n-1
#pragma warning (disable :4996)
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll modd = 1e9 + 7;
vector<int> v0, v1;
char S[200010];
int main() {
int n, k;
scanf("%d %d", &n, &k);
getchar();
scanf("%s", S);
v0.push_back(-1);
v1.push_back(-1);
for (int i = 0; i < n; i++) {
if (S[i] == '0')
v0.push_back(i);
else
v1.push_back(i);
}
v0.push_back(n);
v1.push_back(n);
int maxn = 0;
if (v0.size() - 2 <= k)
maxn = n;
else { //0->1
for (int i = 1, j = k; j < v0.size()-1; i++, j++) {
//把第v0[i]到v0[j]之间的0全改为1
//v0[j+1]->最后一个1的后一位 v0[j+1]-1为最后一个1
//v0[i-1]->第一个1的前一位 v0[i-1]+1为第一个1
//v0[j+1]-1-(v0[i-1]+1)+1
maxn = max(maxn, v0[j + 1] - v0[i-1] - 1);
}
}
if (v1.size() - 2 <= k)
maxn = n;
else {//1->0
for (int i = 1, j = k; j < v1.size()-1; i++, j++) {
maxn = max(maxn, v1[j + 1] - v1[i - 1] - 1);
}
}
cout << maxn << endl;
}



京公网安备 11010502036488号