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