#include<bits/stdc++.h>
using namespace std;
const int max_n = 8e3+5;
int N, K, T;
int A[max_n];
int Pref[max_n][3];
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> N >> K >> T;
for (int i = 1; i <= N; i++) {
char c; cin >> c;
A[i] = c - '1';
if (i > 0) {
Pref[i][0] = Pref[i-1][0];
Pref[i][1] = Pref[i-1][1];
Pref[i][2] = Pref[i-1][2];
}
Pref[i][A[i]]++;
// cerr << i << " " << Pref[i][0] << " " << Pref[i][1] << " " << Pref[i][2] << "\n";
}
A[0] = 5;
// A[N+1] = 5;
// Pref[N+1][0] = Pref[N][0];
// Pref[N+1][1] = Pref[N][1];
// Pref[N+1][2] = Pref[N][2];
N += 1;
int Score = -1;
int SpotkaniaOminiete = Pref[N-1][0];
int ZadaniaGwarantowane = Pref[N-1][2] + SpotkaniaOminiete;
int SpotkaniaLubZadania = Pref[N-1][1];
// cerr << SpotkaniaOminiete << " " << ZadaniaGwarantowane << " " << SpotkaniaLubZadania << "\n";
if (SpotkaniaOminiete <= K) {
int Rem = K - SpotkaniaOminiete;
ZadaniaGwarantowane += min(Rem, SpotkaniaLubZadania);
Score = max(Score, ZadaniaGwarantowane);
}
for (int l = 0; l < N - 2 * T; l++) {
for (int r = l + T + 1; r < N - T; r++) {
/*
Sekcja [0, l] i [r + T + 1, N-1] -> tylko spotkania zdalne lub zadanka
[l + T + 1, r] -> tylko spotkania zdalne lub biurowe
*/
int ZadaniaGwarantowane = Pref[N-1][2] - Pref[r+T][2] + Pref[l][2];
ZadaniaGwarantowane += Pref[N-1][0] - Pref[r+T][0] + Pref[l][0];
int SpotkaniaLubZadania = Pref[N-1][1] - Pref[r+T][1] + Pref[l][1];
int SpotkaniaOminiete = Pref[N-1][0] - Pref[r][0] + Pref[l + T][0];
SpotkaniaOminiete += Pref[r+T][1] - Pref[r][1] + Pref[l+T][1] - Pref[l][1];
// cerr << l << " " << r << "\n";
// cerr << ZadaniaGwarantowane << " " << SpotkaniaLubZadania << " " << SpotkaniaOminiete << "\n";
if (SpotkaniaOminiete > K) continue;
int Rem = K - SpotkaniaOminiete;
ZadaniaGwarantowane += min(Rem, SpotkaniaLubZadania);
Score = max(Score, ZadaniaGwarantowane);
// cerr << ZadaniaGwarantowane << "\n";
}
}
cout << Score << "\n";
}
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 | #include<bits/stdc++.h> using namespace std; const int max_n = 8e3+5; int N, K, T; int A[max_n]; int Pref[max_n][3]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> K >> T; for (int i = 1; i <= N; i++) { char c; cin >> c; A[i] = c - '1'; if (i > 0) { Pref[i][0] = Pref[i-1][0]; Pref[i][1] = Pref[i-1][1]; Pref[i][2] = Pref[i-1][2]; } Pref[i][A[i]]++; // cerr << i << " " << Pref[i][0] << " " << Pref[i][1] << " " << Pref[i][2] << "\n"; } A[0] = 5; // A[N+1] = 5; // Pref[N+1][0] = Pref[N][0]; // Pref[N+1][1] = Pref[N][1]; // Pref[N+1][2] = Pref[N][2]; N += 1; int Score = -1; int SpotkaniaOminiete = Pref[N-1][0]; int ZadaniaGwarantowane = Pref[N-1][2] + SpotkaniaOminiete; int SpotkaniaLubZadania = Pref[N-1][1]; // cerr << SpotkaniaOminiete << " " << ZadaniaGwarantowane << " " << SpotkaniaLubZadania << "\n"; if (SpotkaniaOminiete <= K) { int Rem = K - SpotkaniaOminiete; ZadaniaGwarantowane += min(Rem, SpotkaniaLubZadania); Score = max(Score, ZadaniaGwarantowane); } for (int l = 0; l < N - 2 * T; l++) { for (int r = l + T + 1; r < N - T; r++) { /* Sekcja [0, l] i [r + T + 1, N-1] -> tylko spotkania zdalne lub zadanka [l + T + 1, r] -> tylko spotkania zdalne lub biurowe */ int ZadaniaGwarantowane = Pref[N-1][2] - Pref[r+T][2] + Pref[l][2]; ZadaniaGwarantowane += Pref[N-1][0] - Pref[r+T][0] + Pref[l][0]; int SpotkaniaLubZadania = Pref[N-1][1] - Pref[r+T][1] + Pref[l][1]; int SpotkaniaOminiete = Pref[N-1][0] - Pref[r][0] + Pref[l + T][0]; SpotkaniaOminiete += Pref[r+T][1] - Pref[r][1] + Pref[l+T][1] - Pref[l][1]; // cerr << l << " " << r << "\n"; // cerr << ZadaniaGwarantowane << " " << SpotkaniaLubZadania << " " << SpotkaniaOminiete << "\n"; if (SpotkaniaOminiete > K) continue; int Rem = K - SpotkaniaOminiete; ZadaniaGwarantowane += min(Rem, SpotkaniaLubZadania); Score = max(Score, ZadaniaGwarantowane); // cerr << ZadaniaGwarantowane << "\n"; } } cout << Score << "\n"; } |
English