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