#include <algorithm> #include <cstdio> constexpr auto MAX_SIZE = 8002; constexpr auto OFFICE = 0; constexpr auto REMOTE = 1; constexpr auto FREE = 2; struct Data { Data() : sum(0) { for (int i = 0; i < MAX_SIZE; ++i) { prefix[i] = 0; suffix[i] = 0; } } int sum; int prefix[MAX_SIZE]; int suffix[MAX_SIZE]; }; int sum(const Data* data, const int start, const int stop, const unsigned char v) { if (start <= stop) { return data[v].sum - data[v].prefix[start - 1] - data[v].suffix[stop + 1]; } else { return 0; } } int result(const Data* data, const int n, const int neededMeetings, const int t, const int start, const int stop) { const auto startFixed = start + t; const auto stopFixed = stop - t; const auto officeMeetings = sum(data, startFixed, stopFixed, OFFICE) + sum(data, startFixed, stopFixed, REMOTE); const auto remoteMeetings = sum(data, 1, start - 1, REMOTE) + sum(data, stop + 1, n, REMOTE); const auto noMeetings = start - 1 + n - stop; if (neededMeetings <= officeMeetings) { return noMeetings; } else if (neededMeetings <= officeMeetings + remoteMeetings) { return noMeetings - (neededMeetings - officeMeetings); } else { return -1; } } int main() { int n, k, t; Data data[3]; unsigned char type[8000], v; scanf("%d %d %d\n", &n, &k, &t); for (int i = 1; i <= n; ++i) { scanf("%c\n", &v); v -= '1'; type[i] = v; data[v].sum++; data[OFFICE].prefix[i] = data[OFFICE].prefix[i - 1]; data[REMOTE].prefix[i] = data[REMOTE].prefix[i - 1]; data[FREE].prefix[i] = data[FREE].prefix[i - 1]; data[v].prefix[i]++; } for (int i = n; i >= 1; --i) { v = type[i]; data[OFFICE].suffix[i] = data[OFFICE].suffix[i + 1]; data[REMOTE].suffix[i] = data[REMOTE].suffix[i + 1]; data[FREE].suffix[i] = data[FREE].suffix[i + 1]; data[v].suffix[i]++; } if (data[OFFICE].sum <= k) { // go to office not needed const auto mettings = data[REMOTE].sum + data[OFFICE].sum; printf("%d\n", n - std::max(0, mettings - k)); } else { const auto neededMeetings = data[REMOTE].sum + data[OFFICE].sum - k; int r = -1; for (int i = 1; i <= n - 2 * t + 1; ++i) { for (int j = i + 2 * t - 1; j <= n; ++j) { r = std::max(r, result(data, n, neededMeetings, t, i, j)); } } printf("%d\n", r); } 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 | #include <algorithm> #include <cstdio> constexpr auto MAX_SIZE = 8002; constexpr auto OFFICE = 0; constexpr auto REMOTE = 1; constexpr auto FREE = 2; struct Data { Data() : sum(0) { for (int i = 0; i < MAX_SIZE; ++i) { prefix[i] = 0; suffix[i] = 0; } } int sum; int prefix[MAX_SIZE]; int suffix[MAX_SIZE]; }; int sum(const Data* data, const int start, const int stop, const unsigned char v) { if (start <= stop) { return data[v].sum - data[v].prefix[start - 1] - data[v].suffix[stop + 1]; } else { return 0; } } int result(const Data* data, const int n, const int neededMeetings, const int t, const int start, const int stop) { const auto startFixed = start + t; const auto stopFixed = stop - t; const auto officeMeetings = sum(data, startFixed, stopFixed, OFFICE) + sum(data, startFixed, stopFixed, REMOTE); const auto remoteMeetings = sum(data, 1, start - 1, REMOTE) + sum(data, stop + 1, n, REMOTE); const auto noMeetings = start - 1 + n - stop; if (neededMeetings <= officeMeetings) { return noMeetings; } else if (neededMeetings <= officeMeetings + remoteMeetings) { return noMeetings - (neededMeetings - officeMeetings); } else { return -1; } } int main() { int n, k, t; Data data[3]; unsigned char type[8000], v; scanf("%d %d %d\n", &n, &k, &t); for (int i = 1; i <= n; ++i) { scanf("%c\n", &v); v -= '1'; type[i] = v; data[v].sum++; data[OFFICE].prefix[i] = data[OFFICE].prefix[i - 1]; data[REMOTE].prefix[i] = data[REMOTE].prefix[i - 1]; data[FREE].prefix[i] = data[FREE].prefix[i - 1]; data[v].prefix[i]++; } for (int i = n; i >= 1; --i) { v = type[i]; data[OFFICE].suffix[i] = data[OFFICE].suffix[i + 1]; data[REMOTE].suffix[i] = data[REMOTE].suffix[i + 1]; data[FREE].suffix[i] = data[FREE].suffix[i + 1]; data[v].suffix[i]++; } if (data[OFFICE].sum <= k) { // go to office not needed const auto mettings = data[REMOTE].sum + data[OFFICE].sum; printf("%d\n", n - std::max(0, mettings - k)); } else { const auto neededMeetings = data[REMOTE].sum + data[OFFICE].sum - k; int r = -1; for (int i = 1; i <= n - 2 * t + 1; ++i) { for (int j = i + 2 * t - 1; j <= n; ++j) { r = std::max(r, result(data, n, neededMeetings, t, i, j)); } } printf("%d\n", r); } return 0; } |