#include <bits/stdc++.h>
using namespace std;
int n, max_skips, t_do_pracy;
string harmonogram;
inline bool spotkanie(char i) {return (i == '1' || i == '2');}
int zlicz_wymuszone_pominiecia(int p, int q) { // spotkania wymuszone przez jazde, spotkania biurowe pominiete przez bycie w domu
int ans = 0;
for (int i = 0; i < min(n, p); i++) if (harmonogram[i] == '1') ans++;
for (int i = p; i < min(n, p + t_do_pracy); i++) if (harmonogram[i] == '1' || harmonogram[i] == '2') ans++;
for (int i = q; i < min(n, q + t_do_pracy); i++) if (harmonogram[i] == '1' || harmonogram[i] == '2') ans++;
for (int i = q + t_do_pracy; i < n; i++) if (harmonogram[i] == '1') ans++;
return ans;
}
int zlicz_zadania(int p, int q) { // wyjazd do biura | powrót do domu
int pominietych = zlicz_wymuszone_pominiecia(p, q);
int ans = 0;
for (int i = 0; i < min(n, p); i++) { // w domu
if (harmonogram[i] == '3' || harmonogram[i] == '1') ans++;
else if (harmonogram[i] == '2' && pominietych < max_skips) {ans++; pominietych++;}
}
for (int i = q + t_do_pracy; i < n; i++) {
if (harmonogram[i] == '3' || harmonogram[i] == '1') ans++;
else if (harmonogram[i] == '2' && pominietych < max_skips) {ans++; pominietych++;}
}
if (pominietych > max_skips) return -1;
//cerr << " POMINIETE SPOTKANIA: " << pominietych << " WYKONANE ZADANIA: " << ans << "\n";
return ans;
}
int wszystkie_mozliwosci() {
int ans = max(-1, zlicz_zadania(n+1, n+1));
for (int i = 0; i <= n - 2*t_do_pracy; i++) {
for (int j = i + t_do_pracy; j <= n - t_do_pracy; j++) {
//cerr << "DROGA DO PRACY: [" << i << ", " << i + t_do_pracy-1 << "] POWROT: [" << j << ", " << j + t_do_pracy-1 << "]";
ans = max(ans, zlicz_zadania(i, j));
zlicz_zadania(i, j);
}
}
return ans;
}
int main() {
cin >> n >> max_skips >> t_do_pracy >> harmonogram;
cout << wszystkie_mozliwosci();
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 | #include <bits/stdc++.h> using namespace std; int n, max_skips, t_do_pracy; string harmonogram; inline bool spotkanie(char i) {return (i == '1' || i == '2');} int zlicz_wymuszone_pominiecia(int p, int q) { // spotkania wymuszone przez jazde, spotkania biurowe pominiete przez bycie w domu int ans = 0; for (int i = 0; i < min(n, p); i++) if (harmonogram[i] == '1') ans++; for (int i = p; i < min(n, p + t_do_pracy); i++) if (harmonogram[i] == '1' || harmonogram[i] == '2') ans++; for (int i = q; i < min(n, q + t_do_pracy); i++) if (harmonogram[i] == '1' || harmonogram[i] == '2') ans++; for (int i = q + t_do_pracy; i < n; i++) if (harmonogram[i] == '1') ans++; return ans; } int zlicz_zadania(int p, int q) { // wyjazd do biura | powrót do domu int pominietych = zlicz_wymuszone_pominiecia(p, q); int ans = 0; for (int i = 0; i < min(n, p); i++) { // w domu if (harmonogram[i] == '3' || harmonogram[i] == '1') ans++; else if (harmonogram[i] == '2' && pominietych < max_skips) {ans++; pominietych++;} } for (int i = q + t_do_pracy; i < n; i++) { if (harmonogram[i] == '3' || harmonogram[i] == '1') ans++; else if (harmonogram[i] == '2' && pominietych < max_skips) {ans++; pominietych++;} } if (pominietych > max_skips) return -1; //cerr << " POMINIETE SPOTKANIA: " << pominietych << " WYKONANE ZADANIA: " << ans << "\n"; return ans; } int wszystkie_mozliwosci() { int ans = max(-1, zlicz_zadania(n+1, n+1)); for (int i = 0; i <= n - 2*t_do_pracy; i++) { for (int j = i + t_do_pracy; j <= n - t_do_pracy; j++) { //cerr << "DROGA DO PRACY: [" << i << ", " << i + t_do_pracy-1 << "] POWROT: [" << j << ", " << j + t_do_pracy-1 << "]"; ans = max(ans, zlicz_zadania(i, j)); zlicz_zadania(i, j); } } return ans; } int main() { cin >> n >> max_skips >> t_do_pracy >> harmonogram; cout << wszystkie_mozliwosci(); return 0; } |
English