#include <bits/stdc++.h> using namespace std; static const char FREE = '3'; static const char REMOTE = '2'; static const char OFFICE = '1'; inline int get_sum(vector<int> &sum_arr, int l, int r){ if (l < 0 || r < 0 || l > r) return 0; return sum_arr[r+1] - sum_arr[l]; } int check_for_given_params(vector<int> &frees_sum, vector<int> &remotes_sum, vector<int> &offices_sum, int l, int r, int u, int t, int n) { int num_of_mettings_in_office = get_sum(remotes_sum, l, r) + get_sum(offices_sum, l, r); int num_of_mettings_remotely = remotes_sum[n+1] - get_sum(remotes_sum, l - t, r + t); if (num_of_mettings_remotely + num_of_mettings_in_office < u) return -1; return (frees_sum[n+1] - get_sum(frees_sum, l-t, r + t) + offices_sum[n+1] - get_sum(offices_sum, l-t, r+t) + min(num_of_mettings_remotely, num_of_mettings_remotely + num_of_mettings_in_office - u) ); } int main() { ios_base::sync_with_stdio(false); int n, u, t; cin >> n >> u >> t; string days; cin >> days; vector<int> frees_sum(n+2, 0); vector<int> remotes_sum(n+2, 0); vector<int> offices_sum(n+2, 0); for (int k=0;k < n; k++) { frees_sum[k+1] = frees_sum[k]; remotes_sum[k+1] = remotes_sum[k]; offices_sum[k+1] = offices_sum[k]; if(days[k] == FREE) frees_sum[k+1]++; else if(days[k] == REMOTE) remotes_sum[k+1]++; else if(days[k] == OFFICE) offices_sum[k+1]++; } frees_sum[n+1] = frees_sum[n]; remotes_sum[n+1] = remotes_sum[n]; offices_sum[n+1] = offices_sum[n]; u = max(remotes_sum[n] + offices_sum[n] - u, 0); if (remotes_sum[n] >= u) { cout << n - u; return 0; } int result = -1; for (int l = t; l < n - t; l++) { for (int r = l; r < n - t; r++) { int range_res = check_for_given_params(frees_sum, remotes_sum, offices_sum, l, r, u, t, n); result = max(result, range_res); } } cout << result; }
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 | #include <bits/stdc++.h> using namespace std; static const char FREE = '3'; static const char REMOTE = '2'; static const char OFFICE = '1'; inline int get_sum(vector<int> &sum_arr, int l, int r){ if (l < 0 || r < 0 || l > r) return 0; return sum_arr[r+1] - sum_arr[l]; } int check_for_given_params(vector<int> &frees_sum, vector<int> &remotes_sum, vector<int> &offices_sum, int l, int r, int u, int t, int n) { int num_of_mettings_in_office = get_sum(remotes_sum, l, r) + get_sum(offices_sum, l, r); int num_of_mettings_remotely = remotes_sum[n+1] - get_sum(remotes_sum, l - t, r + t); if (num_of_mettings_remotely + num_of_mettings_in_office < u) return -1; return (frees_sum[n+1] - get_sum(frees_sum, l-t, r + t) + offices_sum[n+1] - get_sum(offices_sum, l-t, r+t) + min(num_of_mettings_remotely, num_of_mettings_remotely + num_of_mettings_in_office - u) ); } int main() { ios_base::sync_with_stdio(false); int n, u, t; cin >> n >> u >> t; string days; cin >> days; vector<int> frees_sum(n+2, 0); vector<int> remotes_sum(n+2, 0); vector<int> offices_sum(n+2, 0); for (int k=0;k < n; k++) { frees_sum[k+1] = frees_sum[k]; remotes_sum[k+1] = remotes_sum[k]; offices_sum[k+1] = offices_sum[k]; if(days[k] == FREE) frees_sum[k+1]++; else if(days[k] == REMOTE) remotes_sum[k+1]++; else if(days[k] == OFFICE) offices_sum[k+1]++; } frees_sum[n+1] = frees_sum[n]; remotes_sum[n+1] = remotes_sum[n]; offices_sum[n+1] = offices_sum[n]; u = max(remotes_sum[n] + offices_sum[n] - u, 0); if (remotes_sum[n] >= u) { cout << n - u; return 0; } int result = -1; for (int l = t; l < n - t; l++) { for (int r = l; r < n - t; r++) { int range_res = check_for_given_params(frees_sum, remotes_sum, offices_sum, l, r, u, t, n); result = max(result, range_res); } } cout << result; } |