#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<vi> vvi; typedef vector<bool> vb; #define eb emplace_back #define pb push_back #define loop(i, a, b) for (int i = a; i < b; i++) #define rloop(i, a, b) for (int i = a; i >= b; i--) #define all(x) (x).begin(), (x).end() int main() { cin.tie(0)->sync_with_stdio(false); int n, k, t, wyn = -1; char c; cin >> n >> k >> t; vi ilBiur(n + 1), ilZd(n + 1), ilWoln(n + 1); for (int i = 1; i <= n; i++) { cin >> c; ilBiur[i] += ilBiur[i - 1]; ilZd[i] += ilZd[i - 1]; ilWoln[i] += ilWoln[i - 1]; if (c == '1') ilBiur[i]++; else if (c == '2') ilZd[i]++; else ilWoln[i]++; } int ileBiurowych = ilBiur[n] - ilBiur[0]; if (ileBiurowych <= k) { int ileZdalnychMozeOpuscic = min(k - ileBiurowych, ilZd[n] - ilZd[0]); wyn = ileZdalnychMozeOpuscic + ileBiurowych + (ilWoln[n] - ilWoln[0]); } for (int i = 1; i <= n - (2 * t) + 1; i++) { int domil1 = ilBiur[i-1] - ilBiur[0]; int domil2 = ilZd[i-1] - ilZd[0]; int domil3 = ilWoln[i-1] - ilWoln[0]; int opuszczoneSpNaDojazd = (ilBiur[i + t - 1] - ilBiur[i - 1]) + (ilZd[i + t - 1] - ilZd[i - 1]); for (int j = i + t; j <= n - t + 1; j++) { int opuszczoneSpNaDojazd2 = (ilBiur[j + t - 1] - ilBiur[j - 1]) + (ilZd[j + t - 1] - ilZd[j - 1]); int lacznieOpSpNaDoj = opuszczoneSpNaDojazd + opuszczoneSpNaDojazd2; int domPil1 = ilBiur[n] - ilBiur[j + t - 1]; int domPil2 = ilZd[n] - ilZd[j + t - 1]; int domPil3 = ilWoln[n] - ilWoln[j + t - 1]; int calIl1 = domil1 + domPil1; int calIl2 = domil2 + domPil2; int calIl3 = domil3 + domPil3; if (calIl1 + lacznieOpSpNaDoj > k) continue; int ileZdalnychMozeOpuscic = min(k - calIl1 - lacznieOpSpNaDoj, calIl2); wyn = max(calIl1 + calIl3 + ileZdalnychMozeOpuscic, wyn); } } cout << wyn; 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<vi> vvi; typedef vector<bool> vb; #define eb emplace_back #define pb push_back #define loop(i, a, b) for (int i = a; i < b; i++) #define rloop(i, a, b) for (int i = a; i >= b; i--) #define all(x) (x).begin(), (x).end() int main() { cin.tie(0)->sync_with_stdio(false); int n, k, t, wyn = -1; char c; cin >> n >> k >> t; vi ilBiur(n + 1), ilZd(n + 1), ilWoln(n + 1); for (int i = 1; i <= n; i++) { cin >> c; ilBiur[i] += ilBiur[i - 1]; ilZd[i] += ilZd[i - 1]; ilWoln[i] += ilWoln[i - 1]; if (c == '1') ilBiur[i]++; else if (c == '2') ilZd[i]++; else ilWoln[i]++; } int ileBiurowych = ilBiur[n] - ilBiur[0]; if (ileBiurowych <= k) { int ileZdalnychMozeOpuscic = min(k - ileBiurowych, ilZd[n] - ilZd[0]); wyn = ileZdalnychMozeOpuscic + ileBiurowych + (ilWoln[n] - ilWoln[0]); } for (int i = 1; i <= n - (2 * t) + 1; i++) { int domil1 = ilBiur[i-1] - ilBiur[0]; int domil2 = ilZd[i-1] - ilZd[0]; int domil3 = ilWoln[i-1] - ilWoln[0]; int opuszczoneSpNaDojazd = (ilBiur[i + t - 1] - ilBiur[i - 1]) + (ilZd[i + t - 1] - ilZd[i - 1]); for (int j = i + t; j <= n - t + 1; j++) { int opuszczoneSpNaDojazd2 = (ilBiur[j + t - 1] - ilBiur[j - 1]) + (ilZd[j + t - 1] - ilZd[j - 1]); int lacznieOpSpNaDoj = opuszczoneSpNaDojazd + opuszczoneSpNaDojazd2; int domPil1 = ilBiur[n] - ilBiur[j + t - 1]; int domPil2 = ilZd[n] - ilZd[j + t - 1]; int domPil3 = ilWoln[n] - ilWoln[j + t - 1]; int calIl1 = domil1 + domPil1; int calIl2 = domil2 + domPil2; int calIl3 = domil3 + domPil3; if (calIl1 + lacznieOpSpNaDoj > k) continue; int ileZdalnychMozeOpuscic = min(k - calIl1 - lacznieOpSpNaDoj, calIl2); wyn = max(calIl1 + calIl3 + ileZdalnychMozeOpuscic, wyn); } } cout << wyn; return 0; } |