#include<bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
int n, k, t;
cin >> n >> k >> t;
string s;
cin >> s;
s = " " + s;
vector<int> pref_praca_biuro(n + 1, 0);
vector<int> pref_praca_dom(n + 1, 0);
vector<int> pref_wolny(n + 1, 0);
for(int i = 1; i <= n; i++){
if(s[i] == '1') pref_praca_biuro[i]++;
else if(s[i] == '2') pref_praca_dom[i]++;
else if(s[i] == '3') pref_wolny[i]++;
pref_praca_biuro[i] += pref_praca_biuro[i - 1];
pref_praca_dom[i] += pref_praca_dom[i - 1];
pref_wolny[i] += pref_wolny[i - 1];
}
int wynik = -1;
for(int i = 1; i <= n; i++){
for(int j = i; j <= n; j++){
int ile_starconych = 0;
if(i - t < 1) continue;
if(j + t > n) continue;
ile_starconych += pref_praca_biuro[i - 1] - pref_praca_biuro[i - t - 1];
ile_starconych += pref_praca_dom[i - 1] - pref_praca_dom[i - t - 1];
ile_starconych += pref_praca_biuro[j + t] - pref_praca_biuro[j];
ile_starconych += pref_praca_dom[j + t] - pref_praca_dom[j];
if(ile_starconych > k) continue;
int ile_praca_biuro = pref_praca_biuro[i - t - 1] + pref_praca_biuro[n] - pref_praca_biuro[j + t];
int ile_praca_dom = pref_praca_dom[i - t - 1] + pref_praca_dom[n] - pref_praca_dom[j + t];
int ile_wolne = pref_wolny[i - t - 1] + pref_wolny[n] - pref_wolny[j + t];
ile_starconych += ile_praca_biuro;
if(ile_starconych > k) continue;
if(ile_starconych + ile_praca_dom <= k){
wynik = max(wynik, ile_wolne + ile_praca_dom + ile_praca_biuro);
}
else{
wynik = max(wynik, ile_wolne + k - ile_starconych + ile_praca_biuro);
}
}
}
int ile_praca_biuro = pref_praca_biuro[n];
int ile_praca_dom = pref_praca_dom[n];
int ile_wolne = pref_wolny[n];
int ile_stracone = 0;
ile_stracone += ile_praca_biuro;
if(ile_stracone > k) cout << wynik;
else cout << max(wynik, ile_wolne + ile_praca_biuro + min(ile_praca_dom, k - ile_stracone));
}
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 | #include<bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, k, t; cin >> n >> k >> t; string s; cin >> s; s = " " + s; vector<int> pref_praca_biuro(n + 1, 0); vector<int> pref_praca_dom(n + 1, 0); vector<int> pref_wolny(n + 1, 0); for(int i = 1; i <= n; i++){ if(s[i] == '1') pref_praca_biuro[i]++; else if(s[i] == '2') pref_praca_dom[i]++; else if(s[i] == '3') pref_wolny[i]++; pref_praca_biuro[i] += pref_praca_biuro[i - 1]; pref_praca_dom[i] += pref_praca_dom[i - 1]; pref_wolny[i] += pref_wolny[i - 1]; } int wynik = -1; for(int i = 1; i <= n; i++){ for(int j = i; j <= n; j++){ int ile_starconych = 0; if(i - t < 1) continue; if(j + t > n) continue; ile_starconych += pref_praca_biuro[i - 1] - pref_praca_biuro[i - t - 1]; ile_starconych += pref_praca_dom[i - 1] - pref_praca_dom[i - t - 1]; ile_starconych += pref_praca_biuro[j + t] - pref_praca_biuro[j]; ile_starconych += pref_praca_dom[j + t] - pref_praca_dom[j]; if(ile_starconych > k) continue; int ile_praca_biuro = pref_praca_biuro[i - t - 1] + pref_praca_biuro[n] - pref_praca_biuro[j + t]; int ile_praca_dom = pref_praca_dom[i - t - 1] + pref_praca_dom[n] - pref_praca_dom[j + t]; int ile_wolne = pref_wolny[i - t - 1] + pref_wolny[n] - pref_wolny[j + t]; ile_starconych += ile_praca_biuro; if(ile_starconych > k) continue; if(ile_starconych + ile_praca_dom <= k){ wynik = max(wynik, ile_wolne + ile_praca_dom + ile_praca_biuro); } else{ wynik = max(wynik, ile_wolne + k - ile_starconych + ile_praca_biuro); } } } int ile_praca_biuro = pref_praca_biuro[n]; int ile_praca_dom = pref_praca_dom[n]; int ile_wolne = pref_wolny[n]; int ile_stracone = 0; ile_stracone += ile_praca_biuro; if(ile_stracone > k) cout << wynik; else cout << max(wynik, ile_wolne + ile_praca_biuro + min(ile_praca_dom, k - ile_stracone)); } |
English