#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;
vector <int> v(n+2);
vector <int> lewozdalne(n+2), prawozdalne(n+2);
vector <int> lewostacjonarnie(n+2), prawostacjonarnie(n+2);
vector <int> lewofree(n+2), prawofree(n+2);
for(int i = 1; i<=n; ++i){
char c;
cin >> c;
v[i] = c-'0';
lewostacjonarnie[i] = lewostacjonarnie[i-1];
lewozdalne[i] = lewozdalne[i-1];
lewofree[i] = lewofree[i-1];
if(v[i] == 1){
lewostacjonarnie[i]++;
}else if(v[i] == 2){
lewozdalne[i]++;
}else{
lewofree[i]++;
}
}
for(int i = n; i>=1; --i){
prawostacjonarnie[i] = prawostacjonarnie[i+1];
prawozdalne[i] = prawozdalne[i+1];
prawofree[i] = prawofree[i+1];
if(v[i] == 1){
prawostacjonarnie[i]++;
}else if(v[i] == 2){
prawozdalne[i]++;
}else{
prawofree[i]++;
}
}
int res = -1;
if(lewostacjonarnie[n] <= k){
int pominiete = lewostacjonarnie[n];
int free = lewofree[n] + lewostacjonarnie[n];
int pos = lewozdalne[n];
res = max(res, free + min(pos, k-pominiete));
}
for(int i = 1; i<=n-2*t+1; ++i){
for(int j = i+t; j<=n-t+1; ++j){
int pominiete = lewostacjonarnie[i+t-1] + prawostacjonarnie[j] + lewozdalne[i+t-1] - lewozdalne[i-1] + prawozdalne[j] - prawozdalne[j+t];
if(pominiete > k) continue;
int free = lewofree[i-1] + prawofree[j+t] + lewostacjonarnie[i-1] + prawostacjonarnie[j+t];
int pos = lewozdalne[i-1] + prawozdalne[j+t];
res = max(res, free + min(pos, k-pominiete));
//cerr << i << " " << j << " " << free + min(pos, k-pominiete) << "\n";
}
}
cout << res << "\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 71 72 73 74 75 76 | #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; vector <int> v(n+2); vector <int> lewozdalne(n+2), prawozdalne(n+2); vector <int> lewostacjonarnie(n+2), prawostacjonarnie(n+2); vector <int> lewofree(n+2), prawofree(n+2); for(int i = 1; i<=n; ++i){ char c; cin >> c; v[i] = c-'0'; lewostacjonarnie[i] = lewostacjonarnie[i-1]; lewozdalne[i] = lewozdalne[i-1]; lewofree[i] = lewofree[i-1]; if(v[i] == 1){ lewostacjonarnie[i]++; }else if(v[i] == 2){ lewozdalne[i]++; }else{ lewofree[i]++; } } for(int i = n; i>=1; --i){ prawostacjonarnie[i] = prawostacjonarnie[i+1]; prawozdalne[i] = prawozdalne[i+1]; prawofree[i] = prawofree[i+1]; if(v[i] == 1){ prawostacjonarnie[i]++; }else if(v[i] == 2){ prawozdalne[i]++; }else{ prawofree[i]++; } } int res = -1; if(lewostacjonarnie[n] <= k){ int pominiete = lewostacjonarnie[n]; int free = lewofree[n] + lewostacjonarnie[n]; int pos = lewozdalne[n]; res = max(res, free + min(pos, k-pominiete)); } for(int i = 1; i<=n-2*t+1; ++i){ for(int j = i+t; j<=n-t+1; ++j){ int pominiete = lewostacjonarnie[i+t-1] + prawostacjonarnie[j] + lewozdalne[i+t-1] - lewozdalne[i-1] + prawozdalne[j] - prawozdalne[j+t]; if(pominiete > k) continue; int free = lewofree[i-1] + prawofree[j+t] + lewostacjonarnie[i-1] + prawostacjonarnie[j+t]; int pos = lewozdalne[i-1] + prawozdalne[j+t]; res = max(res, free + min(pos, k-pominiete)); //cerr << i << " " << j << " " << free + min(pos, k-pominiete) << "\n"; } } cout << res << "\n"; } |
English