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