#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"; } |
English