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; }