#include <bits/stdc++.h>
int n, k, t;
std::string s;
int onsite_meetings_prefix_sum[10005];
int remote_meetings_prefix_sum[10005];
int no_meetings_prefix_sum[10005];
int all_meetings_number;
void load_data();
void make_prefix_arrays();
void bruteforce();
void remote_day();
void print_result();
int result = -1;
int main() {
load_data();
make_prefix_arrays();
bruteforce();
remote_day();
print_result();
return 0;
}
void load_data() {
std::cin >> n >> k >> t;
std::cin >> s;
}
void make_prefix_arrays() {
for (int i = 1; i <= n; i++) {
onsite_meetings_prefix_sum[i] = onsite_meetings_prefix_sum[i - 1] + (s[i - 1] == '1');
remote_meetings_prefix_sum[i] = remote_meetings_prefix_sum[i - 1] + (s[i - 1] == '2');
no_meetings_prefix_sum[i] = no_meetings_prefix_sum[i - 1] + (s[i - 1] == '3');
}
all_meetings_number = onsite_meetings_prefix_sum[n] + remote_meetings_prefix_sum[n];
}
void bruteforce() {
for (int i = 0; i <= n - 2 * t; ++i) {
for (int j = i + 2 * t; j <= n; ++j) {
int home_free = no_meetings_prefix_sum[i] +
(no_meetings_prefix_sum[n] - no_meetings_prefix_sum[j]);
int home_remote = remote_meetings_prefix_sum[i] +
(remote_meetings_prefix_sum[n] - remote_meetings_prefix_sum[j]);
int home_office = onsite_meetings_prefix_sum[i] +
(onsite_meetings_prefix_sum[n] - onsite_meetings_prefix_sum[j]);
int transit1 = (onsite_meetings_prefix_sum[i + t] - onsite_meetings_prefix_sum[i]) +
(remote_meetings_prefix_sum[i + t] - remote_meetings_prefix_sum[i]);
int transit2 = (onsite_meetings_prefix_sum[j] - onsite_meetings_prefix_sum[j - t]) +
(remote_meetings_prefix_sum[j] - remote_meetings_prefix_sum[j - t]);
int transit_missed = transit1 + transit2;
int base_missed = transit_missed + home_office;
int available = k - base_missed;
if (available < 0)
continue;
int skipped_remote = std::min(home_remote, available);
int tasks = home_free + skipped_remote + home_office;
result = std::max(result, tasks);
}
}
}
void remote_day() {
int home_office = onsite_meetings_prefix_sum[n];
if (home_office > k)
return;
int home_free = no_meetings_prefix_sum[n] + home_office;
int home_remote = remote_meetings_prefix_sum[n];
int available = k - home_office;
int skipped_remote = std::min(home_remote, available);
int tasks = home_free + skipped_remote;
result = std::max(result, tasks);
}
void print_result() {
std::cout << result << std::endl;
}
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 86 87 88 89 90 | #include <bits/stdc++.h> int n, k, t; std::string s; int onsite_meetings_prefix_sum[10005]; int remote_meetings_prefix_sum[10005]; int no_meetings_prefix_sum[10005]; int all_meetings_number; void load_data(); void make_prefix_arrays(); void bruteforce(); void remote_day(); void print_result(); int result = -1; int main() { load_data(); make_prefix_arrays(); bruteforce(); remote_day(); print_result(); return 0; } void load_data() { std::cin >> n >> k >> t; std::cin >> s; } void make_prefix_arrays() { for (int i = 1; i <= n; i++) { onsite_meetings_prefix_sum[i] = onsite_meetings_prefix_sum[i - 1] + (s[i - 1] == '1'); remote_meetings_prefix_sum[i] = remote_meetings_prefix_sum[i - 1] + (s[i - 1] == '2'); no_meetings_prefix_sum[i] = no_meetings_prefix_sum[i - 1] + (s[i - 1] == '3'); } all_meetings_number = onsite_meetings_prefix_sum[n] + remote_meetings_prefix_sum[n]; } void bruteforce() { for (int i = 0; i <= n - 2 * t; ++i) { for (int j = i + 2 * t; j <= n; ++j) { int home_free = no_meetings_prefix_sum[i] + (no_meetings_prefix_sum[n] - no_meetings_prefix_sum[j]); int home_remote = remote_meetings_prefix_sum[i] + (remote_meetings_prefix_sum[n] - remote_meetings_prefix_sum[j]); int home_office = onsite_meetings_prefix_sum[i] + (onsite_meetings_prefix_sum[n] - onsite_meetings_prefix_sum[j]); int transit1 = (onsite_meetings_prefix_sum[i + t] - onsite_meetings_prefix_sum[i]) + (remote_meetings_prefix_sum[i + t] - remote_meetings_prefix_sum[i]); int transit2 = (onsite_meetings_prefix_sum[j] - onsite_meetings_prefix_sum[j - t]) + (remote_meetings_prefix_sum[j] - remote_meetings_prefix_sum[j - t]); int transit_missed = transit1 + transit2; int base_missed = transit_missed + home_office; int available = k - base_missed; if (available < 0) continue; int skipped_remote = std::min(home_remote, available); int tasks = home_free + skipped_remote + home_office; result = std::max(result, tasks); } } } void remote_day() { int home_office = onsite_meetings_prefix_sum[n]; if (home_office > k) return; int home_free = no_meetings_prefix_sum[n] + home_office; int home_remote = remote_meetings_prefix_sum[n]; int available = k - home_office; int skipped_remote = std::min(home_remote, available); int tasks = home_free + skipped_remote; result = std::max(result, tasks); } void print_result() { std::cout << result << std::endl; } |
English