#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <algorithm>
char commands[8192];
int remotes_psum[8192];
int onsite_psum[8192];
const char ONSITE_MEETING = '1';
const char REMOTE_MEETING = '2';
const char FOCUS_TIME = '3';
int main() {
int n, k, t;
scanf("%d %d %d\n", &n, &k, &t);
scanf("%s\n", commands);
remotes_psum[0] = 0;
onsite_psum[0] = 0;
for (int i = 0; i < n; i++) {
switch (commands[i]) {
case ONSITE_MEETING:
remotes_psum[i + 1] = remotes_psum[i];
onsite_psum[i + 1] = onsite_psum[i] + 1;
break;
case REMOTE_MEETING:
remotes_psum[i + 1] = remotes_psum[i] + 1;
onsite_psum[i + 1] = onsite_psum[i];
break;
case FOCUS_TIME:
remotes_psum[i + 1] = remotes_psum[i];
onsite_psum[i + 1] = onsite_psum[i];
break;
default:
assert(false);
};
}
int best = -1;
// Special case: we don't go to work at all
// We must skip all onsite meetings in that case
// We can attend all remote meetings in the worst case, though
if (onsite_psum[n] <= k) {
// We can also skip some remote meetings, but - combined with skipped
// onsite meetings - not more than k. We use the remaining time
// to solve algorithmic tasks.
best = n - std::max(0, onsite_psum[n] + remotes_psum[n] - k);
}
// Leave home at i, arrive back at j
for (int i = 0; i <= n - 2 * t; i++) {
for (int j = i + 2 * t; j <= n; j++) {
// Onsite meetings must be skipped when we are not at work
const int onsite_mandatorily_skipped = onsite_psum[n] - onsite_psum[j - t] + onsite_psum[i + t];
// Remote meetings must be skipped while we travel to work
const int remote_mandatorily_skipped
= remotes_psum[j] - remotes_psum[j - t]
+ remotes_psum[i + t] - remotes_psum[i];
if (onsite_mandatorily_skipped + remote_mandatorily_skipped <= k) {
const int remaining_skip_budget = k - onsite_mandatorily_skipped - remote_mandatorily_skipped;
const int remote_meetings_while_at_home = remotes_psum[n] - remotes_psum[j] + remotes_psum[i];
// No use in skipping meetings at work - they won't increase
// the available time for solving tasks. It only makes sense
// to skip remote meetings outside work.
const int time_for_tasks = n - (j - i) - std::max(0, remote_meetings_while_at_home - remaining_skip_budget);
// printf("(%d %d): %d (mandatory: %d, voluntarily: %d)\n", i, j, time_for_tasks, onsite_mandatorily_skipped + remote_mandatorily_skipped, std::min(0, remote_meetings_while_at_home - remaining_skip_budget));
best = std::max(best, time_for_tasks);
} else {
// printf("(%d %d): (mandatory: %d)\n", i, j, onsite_mandatorily_skipped + remote_mandatorily_skipped);
}
}
}
printf("%d\n", best);
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 82 83 84 85 | #include <cstdio> #include <cstdlib> #include <cassert> #include <algorithm> char commands[8192]; int remotes_psum[8192]; int onsite_psum[8192]; const char ONSITE_MEETING = '1'; const char REMOTE_MEETING = '2'; const char FOCUS_TIME = '3'; int main() { int n, k, t; scanf("%d %d %d\n", &n, &k, &t); scanf("%s\n", commands); remotes_psum[0] = 0; onsite_psum[0] = 0; for (int i = 0; i < n; i++) { switch (commands[i]) { case ONSITE_MEETING: remotes_psum[i + 1] = remotes_psum[i]; onsite_psum[i + 1] = onsite_psum[i] + 1; break; case REMOTE_MEETING: remotes_psum[i + 1] = remotes_psum[i] + 1; onsite_psum[i + 1] = onsite_psum[i]; break; case FOCUS_TIME: remotes_psum[i + 1] = remotes_psum[i]; onsite_psum[i + 1] = onsite_psum[i]; break; default: assert(false); }; } int best = -1; // Special case: we don't go to work at all // We must skip all onsite meetings in that case // We can attend all remote meetings in the worst case, though if (onsite_psum[n] <= k) { // We can also skip some remote meetings, but - combined with skipped // onsite meetings - not more than k. We use the remaining time // to solve algorithmic tasks. best = n - std::max(0, onsite_psum[n] + remotes_psum[n] - k); } // Leave home at i, arrive back at j for (int i = 0; i <= n - 2 * t; i++) { for (int j = i + 2 * t; j <= n; j++) { // Onsite meetings must be skipped when we are not at work const int onsite_mandatorily_skipped = onsite_psum[n] - onsite_psum[j - t] + onsite_psum[i + t]; // Remote meetings must be skipped while we travel to work const int remote_mandatorily_skipped = remotes_psum[j] - remotes_psum[j - t] + remotes_psum[i + t] - remotes_psum[i]; if (onsite_mandatorily_skipped + remote_mandatorily_skipped <= k) { const int remaining_skip_budget = k - onsite_mandatorily_skipped - remote_mandatorily_skipped; const int remote_meetings_while_at_home = remotes_psum[n] - remotes_psum[j] + remotes_psum[i]; // No use in skipping meetings at work - they won't increase // the available time for solving tasks. It only makes sense // to skip remote meetings outside work. const int time_for_tasks = n - (j - i) - std::max(0, remote_meetings_while_at_home - remaining_skip_budget); // printf("(%d %d): %d (mandatory: %d, voluntarily: %d)\n", i, j, time_for_tasks, onsite_mandatorily_skipped + remote_mandatorily_skipped, std::min(0, remote_meetings_while_at_home - remaining_skip_budget)); best = std::max(best, time_for_tasks); } else { // printf("(%d %d): (mandatory: %d)\n", i, j, onsite_mandatorily_skipped + remote_mandatorily_skipped); } } } printf("%d\n", best); return 0; } |
English