#include<iostream> int eventsInRange(int* arr, int size, int start, int end) { end = std::min(end, size - 1); start = std::max(start, 0); if (start > end) return 0; return arr[end] - (start > 0 ? arr[start - 1] : 0); } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; std::cin >> n; int k; std::cin >> k; int t; std::cin >> t; int officeMeetingsTillNow[n]; int homeMeetingsTillNow[n]; char c; std::cin >> c; officeMeetingsTillNow[0] = c == '1'; homeMeetingsTillNow[0] = c == '2'; for (int i = 1; i < n; i++) { char c; std::cin >> c; officeMeetingsTillNow[i] = officeMeetingsTillNow[i - 1] + (c == '1'); homeMeetingsTillNow[i] = homeMeetingsTillNow[i - 1] + (c == '2'); } int meetingsTotal = officeMeetingsTillNow[n - 1] + homeMeetingsTillNow[n - 1]; if (officeMeetingsTillNow[n - 1] <= k) { int homeK = k - officeMeetingsTillNow[n - 1]; int timeLeisure = n - std::max(homeMeetingsTillNow[n - 1] - homeK, 0); std::cout << timeLeisure << "\n"; return 0; } int maxTimeLeisure = -1; for (int i = t; i < n; i++) for (int j = i; j < n - t; j++) { int meetingsDuringWork = eventsInRange(officeMeetingsTillNow, n, i, j) + eventsInRange(homeMeetingsTillNow, n, i, j); int meetingsDuringHome = eventsInRange(homeMeetingsTillNow, n, 0, i - t - 1) + eventsInRange(homeMeetingsTillNow, n, j + t + 1, n - 1); int neededMeetings = std::max(meetingsTotal - meetingsDuringWork - k, 0); int timeInHome = (i - t) + (n - (j + t + 1)); if (meetingsDuringHome >= neededMeetings) maxTimeLeisure = std::max(maxTimeLeisure, timeInHome - neededMeetings); } std::cout << maxTimeLeisure << "\n"; 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 | #include<iostream> int eventsInRange(int* arr, int size, int start, int end) { end = std::min(end, size - 1); start = std::max(start, 0); if (start > end) return 0; return arr[end] - (start > 0 ? arr[start - 1] : 0); } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; std::cin >> n; int k; std::cin >> k; int t; std::cin >> t; int officeMeetingsTillNow[n]; int homeMeetingsTillNow[n]; char c; std::cin >> c; officeMeetingsTillNow[0] = c == '1'; homeMeetingsTillNow[0] = c == '2'; for (int i = 1; i < n; i++) { char c; std::cin >> c; officeMeetingsTillNow[i] = officeMeetingsTillNow[i - 1] + (c == '1'); homeMeetingsTillNow[i] = homeMeetingsTillNow[i - 1] + (c == '2'); } int meetingsTotal = officeMeetingsTillNow[n - 1] + homeMeetingsTillNow[n - 1]; if (officeMeetingsTillNow[n - 1] <= k) { int homeK = k - officeMeetingsTillNow[n - 1]; int timeLeisure = n - std::max(homeMeetingsTillNow[n - 1] - homeK, 0); std::cout << timeLeisure << "\n"; return 0; } int maxTimeLeisure = -1; for (int i = t; i < n; i++) for (int j = i; j < n - t; j++) { int meetingsDuringWork = eventsInRange(officeMeetingsTillNow, n, i, j) + eventsInRange(homeMeetingsTillNow, n, i, j); int meetingsDuringHome = eventsInRange(homeMeetingsTillNow, n, 0, i - t - 1) + eventsInRange(homeMeetingsTillNow, n, j + t + 1, n - 1); int neededMeetings = std::max(meetingsTotal - meetingsDuringWork - k, 0); int timeInHome = (i - t) + (n - (j + t + 1)); if (meetingsDuringHome >= neededMeetings) maxTimeLeisure = std::max(maxTimeLeisure, timeInHome - neededMeetings); } std::cout << maxTimeLeisure << "\n"; return 0; } |