#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k, t;
string s;
cin >> n >> k >> t;
cin >> s;
vector<int> prefix1(n + 1, 0);
vector<int> prefix2(n + 1, 0);
vector<int> prefix3(n + 1, 0);
for (int y = 0; y < n; y++) {
prefix1[y + 1] = prefix1[y] + (s[y] == '1');
prefix2[y + 1] = prefix2[y] + (s[y] == '2');
prefix3[y + 1] = prefix3[y] + (s[y] == '3');
}
int maxi = -1;
int total1 = prefix1[n];
if (total1 <= k) {
int pozk = k - total1;
int total2 = prefix2[n];
int maxipom2 = min(total2, pozk);
int czas = total1 + prefix3[n] + maxipom2;
if (czas > maxi) {
maxi = czas;
}
}
if (2 * t <= n) {
for (int start = 0; start <= n - 2 * t; start++) {
int start_transit_end = start + t;
for (int opusz = start_transit_end; opusz <= n - t; opusz++) {
int biurostart = start + t;
int biurokon = opusz;
int biuro1 = prefix1[biurokon] - prefix1[biurostart];
int opuszczone = prefix1[n] - biuro1;
int przejdo = prefix2[start_transit_end] - prefix2[start];
int przejz = prefix2[opusz + t] - prefix2[opusz];
int przej = przejdo + przejz;
int bazopusz = opuszczone + przej;
if (bazopusz > k) continue;
int dom2 = (prefix2[start] - prefix2[0]) + (prefix2[n] - prefix2[opusz + t]);
int dom3 = (prefix3[start] - prefix3[0]) + (prefix3[n] - prefix3[opusz + t]);
int pozk = k - bazopusz;
int maxpom = min(dom2, pozk);
int zad = dom3 + maxpom;
if (zad > maxi) {
maxi = zad;
}
}
}
}
cout << maxi;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <iostream> #include <vector> using namespace std; int main() { int n, k, t; string s; cin >> n >> k >> t; cin >> s; vector<int> prefix1(n + 1, 0); vector<int> prefix2(n + 1, 0); vector<int> prefix3(n + 1, 0); for (int y = 0; y < n; y++) { prefix1[y + 1] = prefix1[y] + (s[y] == '1'); prefix2[y + 1] = prefix2[y] + (s[y] == '2'); prefix3[y + 1] = prefix3[y] + (s[y] == '3'); } int maxi = -1; int total1 = prefix1[n]; if (total1 <= k) { int pozk = k - total1; int total2 = prefix2[n]; int maxipom2 = min(total2, pozk); int czas = total1 + prefix3[n] + maxipom2; if (czas > maxi) { maxi = czas; } } if (2 * t <= n) { for (int start = 0; start <= n - 2 * t; start++) { int start_transit_end = start + t; for (int opusz = start_transit_end; opusz <= n - t; opusz++) { int biurostart = start + t; int biurokon = opusz; int biuro1 = prefix1[biurokon] - prefix1[biurostart]; int opuszczone = prefix1[n] - biuro1; int przejdo = prefix2[start_transit_end] - prefix2[start]; int przejz = prefix2[opusz + t] - prefix2[opusz]; int przej = przejdo + przejz; int bazopusz = opuszczone + przej; if (bazopusz > k) continue; int dom2 = (prefix2[start] - prefix2[0]) + (prefix2[n] - prefix2[opusz + t]); int dom3 = (prefix3[start] - prefix3[0]) + (prefix3[n] - prefix3[opusz + t]); int pozk = k - bazopusz; int maxpom = min(dom2, pozk); int zad = dom3 + maxpom; if (zad > maxi) { maxi = zad; } } } } cout << maxi; return 0; } |
English