#include <bits/stdc++.h>
using namespace std;
void makePref(int n, vector <int> &vec) {
for (int i = 1; i < n; i++) {
vec[i] += vec[i - 1];
}
}
int getSumOnSeg(int l, int r, vector <int> &pref) {
if (l > r) {
return 0;
}
return pref[r] - (l ? pref[l - 1] : 0);
}
int solve(int n, int k, int t, vector <int> &meetingOffice, vector <int> &meetingOnline) {
makePref(n, meetingOffice);
makePref(n, meetingOnline);
int minMeetings = meetingOffice.back() + meetingOnline.back() - k;
if (minMeetings <= 0) {
return n;
}
if (meetingOffice.back() <= k) {
return n - minMeetings;
}
int ans = -1;
for (int travelL = 0; travelL <= n - t; travelL++) {
for (int travelR = travelL + t + 1; travelR <= n - t; travelR++) {
int possibleMeetingsAtHome = (
getSumOnSeg(0, travelL - 1, meetingOnline) +
getSumOnSeg(travelR + t, n - 1, meetingOnline)
);
int possibleMeetingsInOffice = (
getSumOnSeg(travelL + t, travelR - 1, meetingOnline) +
getSumOnSeg(travelL + t, travelR - 1, meetingOffice)
);
if (possibleMeetingsAtHome + possibleMeetingsInOffice < minMeetings) {
continue;
}
int meetingsInOffice = min(possibleMeetingsInOffice, minMeetings);
int meetingsAtHome = minMeetings - meetingsInOffice;
int ansHere = travelL + (n - travelR - t) - meetingsAtHome;
ans = max(ans, ansHere);
}
}
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
int n, k, t;
cin >> n >> k >> t;
string s;
cin >> s;
vector <int> meetingOffice(n), meetingOnline(n);
for (int i = 0; i < n; i++) {
meetingOffice[i] = s[i] == '1';
meetingOnline[i] = s[i] == '2';
}
cout << solve(n, k, t, meetingOffice, meetingOnline);
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 | #include <bits/stdc++.h> using namespace std; void makePref(int n, vector <int> &vec) { for (int i = 1; i < n; i++) { vec[i] += vec[i - 1]; } } int getSumOnSeg(int l, int r, vector <int> &pref) { if (l > r) { return 0; } return pref[r] - (l ? pref[l - 1] : 0); } int solve(int n, int k, int t, vector <int> &meetingOffice, vector <int> &meetingOnline) { makePref(n, meetingOffice); makePref(n, meetingOnline); int minMeetings = meetingOffice.back() + meetingOnline.back() - k; if (minMeetings <= 0) { return n; } if (meetingOffice.back() <= k) { return n - minMeetings; } int ans = -1; for (int travelL = 0; travelL <= n - t; travelL++) { for (int travelR = travelL + t + 1; travelR <= n - t; travelR++) { int possibleMeetingsAtHome = ( getSumOnSeg(0, travelL - 1, meetingOnline) + getSumOnSeg(travelR + t, n - 1, meetingOnline) ); int possibleMeetingsInOffice = ( getSumOnSeg(travelL + t, travelR - 1, meetingOnline) + getSumOnSeg(travelL + t, travelR - 1, meetingOffice) ); if (possibleMeetingsAtHome + possibleMeetingsInOffice < minMeetings) { continue; } int meetingsInOffice = min(possibleMeetingsInOffice, minMeetings); int meetingsAtHome = minMeetings - meetingsInOffice; int ansHere = travelL + (n - travelR - t) - meetingsAtHome; ans = max(ans, ansHere); } } return ans; } int main() { ios_base::sync_with_stdio(false); int n, k, t; cin >> n >> k >> t; string s; cin >> s; vector <int> meetingOffice(n), meetingOnline(n); for (int i = 0; i < n; i++) { meetingOffice[i] = s[i] == '1'; meetingOnline[i] = s[i] == '2'; } cout << solve(n, k, t, meetingOffice, meetingOnline); return 0; } |
English