#include <bits/stdc++.h> using namespace std; const int maxn = 8007; int n,k,t; int arr[maxn]; // 0 - office meeting, 1 - remote meeting int meetingsPrefix[2][maxn]; int main() { cin >> n >> k >> t; for (int i = 0; i<n; i++) { char c; cin >> c; arr[i] = c-'0'; if (i!=0) { meetingsPrefix[0][i] = meetingsPrefix[0][i-1]; meetingsPrefix[1][i] = meetingsPrefix[1][i-1]; } if(arr[i]!=3) { if(i==0) { meetingsPrefix[arr[i]-1][i] = 1; meetingsPrefix[1-(arr[i]-1)][i] = 0; } else { meetingsPrefix[arr[i]-1][i] = 1 + meetingsPrefix[arr[i]-1][i-1]; meetingsPrefix[1-(arr[i]-1)][i] = meetingsPrefix[1-(arr[i]-1)][i-1]; } } } int totalMeetings = meetingsPrefix[0][n-1] + meetingsPrefix[1][n-1]; int officeMeetings = meetingsPrefix[0][n-1]; int remoteMeetings = meetingsPrefix[1][n-1]; // moge pominac wszystkie if (k >= totalMeetings) { cout << n << "\n"; return 0; } // nie musze jechac do biura jezeli moge pominac wszystkie biurowe spotkania if (k >= officeMeetings) { // i wtedy nie jedziemy do biura, ale musimy pojsc na tyle spotkan // ze pomijamy wszystkie w biurze i "iles" zdalnych cout << n - (totalMeetings - k) << "\n"; return 0; } // nic nie zadzialalo? to musimy sprawdzic // wszystkie kombinacje wyjazdow do biura w O(n^2) int start = 0; int end = t; int maxTasksSoFar=-1; while (start + 2*t <= n) { while (end + t <= n) { // cout << "Rozpatrujemy zakres " << start << " i " << end << "\n"; // 1. wezmy wszystkie spotkania jak jestesmy w biurze bo czemu by nie int takenOfficeMeetings = (meetingsPrefix[0][end-1] - meetingsPrefix[0][start+t-1]) + (meetingsPrefix[1][end-1] - meetingsPrefix[1][start+t-1]); // cout << ">Wziete spotkania biurowe " << takenOfficeMeetings << "\n"; int possibleRemoteMeetingsLeft = meetingsPrefix[1][max(0,start-1)]; // cout << ">Lewe spotkania zdalne " << possibleRemoteMeetingsLeft << "\n"; int possibleRemoteMeetingsRight = meetingsPrefix[1][n-1] - meetingsPrefix[1][min(n-1, end+t-1)]; // cout << ">Prawe spotkania zdalne " << possibleRemoteMeetingsRight << "\n"; int possibleRemoteMeetings = possibleRemoteMeetingsLeft + possibleRemoteMeetingsRight; int requiredMeetingsLeft = totalMeetings - k - takenOfficeMeetings; // cout << ">Jest " << totalMeetings << " spotkan\n"; // cout << ">Wzialem juz " << takenOfficeMeetings << " spotkan\n"; // cout << ">Potrzebne jeszcze " << requiredMeetingsLeft << " spotkan\n"; if (possibleRemoteMeetings >= requiredMeetingsLeft) { int outsideOfficeMeetings = takenOfficeMeetings + requiredMeetingsLeft; // cout << "* Udalo sie zrobic " << n-(requiredMeetingsLeft+end-start + t) << " allgosow\n"; maxTasksSoFar = max(maxTasksSoFar, n-(requiredMeetingsLeft+end-start + t)); } end++; // cout << "\n"; } start++; end = start+t; } cout << maxTasksSoFar << "\n"; }
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 | #include <bits/stdc++.h> using namespace std; const int maxn = 8007; int n,k,t; int arr[maxn]; // 0 - office meeting, 1 - remote meeting int meetingsPrefix[2][maxn]; int main() { cin >> n >> k >> t; for (int i = 0; i<n; i++) { char c; cin >> c; arr[i] = c-'0'; if (i!=0) { meetingsPrefix[0][i] = meetingsPrefix[0][i-1]; meetingsPrefix[1][i] = meetingsPrefix[1][i-1]; } if(arr[i]!=3) { if(i==0) { meetingsPrefix[arr[i]-1][i] = 1; meetingsPrefix[1-(arr[i]-1)][i] = 0; } else { meetingsPrefix[arr[i]-1][i] = 1 + meetingsPrefix[arr[i]-1][i-1]; meetingsPrefix[1-(arr[i]-1)][i] = meetingsPrefix[1-(arr[i]-1)][i-1]; } } } int totalMeetings = meetingsPrefix[0][n-1] + meetingsPrefix[1][n-1]; int officeMeetings = meetingsPrefix[0][n-1]; int remoteMeetings = meetingsPrefix[1][n-1]; // moge pominac wszystkie if (k >= totalMeetings) { cout << n << "\n"; return 0; } // nie musze jechac do biura jezeli moge pominac wszystkie biurowe spotkania if (k >= officeMeetings) { // i wtedy nie jedziemy do biura, ale musimy pojsc na tyle spotkan // ze pomijamy wszystkie w biurze i "iles" zdalnych cout << n - (totalMeetings - k) << "\n"; return 0; } // nic nie zadzialalo? to musimy sprawdzic // wszystkie kombinacje wyjazdow do biura w O(n^2) int start = 0; int end = t; int maxTasksSoFar=-1; while (start + 2*t <= n) { while (end + t <= n) { // cout << "Rozpatrujemy zakres " << start << " i " << end << "\n"; // 1. wezmy wszystkie spotkania jak jestesmy w biurze bo czemu by nie int takenOfficeMeetings = (meetingsPrefix[0][end-1] - meetingsPrefix[0][start+t-1]) + (meetingsPrefix[1][end-1] - meetingsPrefix[1][start+t-1]); // cout << ">Wziete spotkania biurowe " << takenOfficeMeetings << "\n"; int possibleRemoteMeetingsLeft = meetingsPrefix[1][max(0,start-1)]; // cout << ">Lewe spotkania zdalne " << possibleRemoteMeetingsLeft << "\n"; int possibleRemoteMeetingsRight = meetingsPrefix[1][n-1] - meetingsPrefix[1][min(n-1, end+t-1)]; // cout << ">Prawe spotkania zdalne " << possibleRemoteMeetingsRight << "\n"; int possibleRemoteMeetings = possibleRemoteMeetingsLeft + possibleRemoteMeetingsRight; int requiredMeetingsLeft = totalMeetings - k - takenOfficeMeetings; // cout << ">Jest " << totalMeetings << " spotkan\n"; // cout << ">Wzialem juz " << takenOfficeMeetings << " spotkan\n"; // cout << ">Potrzebne jeszcze " << requiredMeetingsLeft << " spotkan\n"; if (possibleRemoteMeetings >= requiredMeetingsLeft) { int outsideOfficeMeetings = takenOfficeMeetings + requiredMeetingsLeft; // cout << "* Udalo sie zrobic " << n-(requiredMeetingsLeft+end-start + t) << " allgosow\n"; maxTasksSoFar = max(maxTasksSoFar, n-(requiredMeetingsLeft+end-start + t)); } end++; // cout << "\n"; } start++; end = start+t; } cout << maxTasksSoFar << "\n"; } |