#include <bits/stdc++.h> using namespace std; int spot[8005]; int online[8005]; int wolny[8005]; int main(){ int n, k, d; string s; cin >> n >> k >> d >> s; if(s[0] == '1') spot[0] = 1; if(s[0] == '2') online[0] = 1; if(s[0] == '3') wolny[0] = 1; for(int i = 1; i < n; i++){ spot[i] = spot[i - 1]; online[i] = online[i - 1]; wolny[i] = wolny[i - 1]; if(s[i] == '1') spot[i]++; if(s[i] == '2') online[i]++; if(s[i] == '3') wolny[i]++; } int job = 0, free = 0, onl = 0, res = -1; for(int i = 0; i < n; i++){ if(s[i] == '1') job++; if(s[i] == '2') onl++; if(s[i] == '3') free++; } if(spot[n - 1] <= k){ int xd = k - spot[n - 1]; cout << wolny[n - 1] + spot[n - 1] + min(xd, online[n - 1]); return 0; } for(int i = 0; i < n - 2 * d; i++){ int skip = 0, prog = 0, zdal = 0; if(i != 0){ zdal = online[i - 1]; prog = i - zdal; skip = spot[i - 1 + d]; skip += online[i - 1 + d] - online[i - 1]; } else{ skip += spot[d - 1] + online[d - 1]; } int it = n - 1; for(int j = i + d; j < n; j++) { if (j == n - d) { skip += spot[n - 1] - spot[j - 1] + online[n - 1] - online[j - 1]; break; } if (spot[n - 1] - spot[j - 1] + online[j - 1 + d] - online[j - 1] <= k - skip) { it = j + d; skip += spot[n - 1] - spot[j - 1] + online[j - 1 + d] - online[j - 1]; prog += wolny[n - 1] - wolny[it - 1] + spot[n - 1] - spot[it - 1]; zdal = online[n - 1] - online[it - 1]; break; } } if (skip <= k) { prog += min(skip - k, zdal); res = max(res, prog); } } cout << res; 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 | #include <bits/stdc++.h> using namespace std; int spot[8005]; int online[8005]; int wolny[8005]; int main(){ int n, k, d; string s; cin >> n >> k >> d >> s; if(s[0] == '1') spot[0] = 1; if(s[0] == '2') online[0] = 1; if(s[0] == '3') wolny[0] = 1; for(int i = 1; i < n; i++){ spot[i] = spot[i - 1]; online[i] = online[i - 1]; wolny[i] = wolny[i - 1]; if(s[i] == '1') spot[i]++; if(s[i] == '2') online[i]++; if(s[i] == '3') wolny[i]++; } int job = 0, free = 0, onl = 0, res = -1; for(int i = 0; i < n; i++){ if(s[i] == '1') job++; if(s[i] == '2') onl++; if(s[i] == '3') free++; } if(spot[n - 1] <= k){ int xd = k - spot[n - 1]; cout << wolny[n - 1] + spot[n - 1] + min(xd, online[n - 1]); return 0; } for(int i = 0; i < n - 2 * d; i++){ int skip = 0, prog = 0, zdal = 0; if(i != 0){ zdal = online[i - 1]; prog = i - zdal; skip = spot[i - 1 + d]; skip += online[i - 1 + d] - online[i - 1]; } else{ skip += spot[d - 1] + online[d - 1]; } int it = n - 1; for(int j = i + d; j < n; j++) { if (j == n - d) { skip += spot[n - 1] - spot[j - 1] + online[n - 1] - online[j - 1]; break; } if (spot[n - 1] - spot[j - 1] + online[j - 1 + d] - online[j - 1] <= k - skip) { it = j + d; skip += spot[n - 1] - spot[j - 1] + online[j - 1 + d] - online[j - 1]; prog += wolny[n - 1] - wolny[it - 1] + spot[n - 1] - spot[it - 1]; zdal = online[n - 1] - online[it - 1]; break; } } if (skip <= k) { prog += min(skip - k, zdal); res = max(res, prog); } } cout << res; return 0; } |