#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, may_skip, commute, total_meetings = 0;
cin >> n >> may_skip >> commute;
vector<int> events(n), in_office{0}, remote{0};
for(auto &i : events) {
char c;
cin >> c;i = c-'0';
total_meetings += (i != 3);
in_office.push_back(in_office.back() + (i == 1));
remote.push_back(remote.back() + (i == 2));
}
int must_attend = max(0, total_meetings - may_skip), ans = -1;
if(remote.back() >= must_attend) {
ans = n - must_attend;
}
for(int start = 1; start + commute - 1 <= n; start++) {
for(int finish = start + commute; finish + commute - 1 <= n; finish++) {
/*
Always attend all meetings in the office
But can also attend remotes
*/
int attend_min = 0;
attend_min += in_office[finish - 1] - in_office[start + commute - 1];
attend_min += remote[finish - 1] - remote[start + commute - 1];
int attend_extra = remote[start - 1] + (remote.back() - remote[finish + commute - 1]);
int need_extra = max(must_attend - attend_min, 0);
int time_home = (start - 1) + (n - (finish + commute - 1));
if(need_extra <= attend_extra) {
ans = max(ans, time_home - need_extra);
}
}
}
cout << ans << '\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 | #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair<int, int> pii; typedef vector<int> vi; int main() { cin.tie(0)->sync_with_stdio(0); int n, may_skip, commute, total_meetings = 0; cin >> n >> may_skip >> commute; vector<int> events(n), in_office{0}, remote{0}; for(auto &i : events) { char c; cin >> c;i = c-'0'; total_meetings += (i != 3); in_office.push_back(in_office.back() + (i == 1)); remote.push_back(remote.back() + (i == 2)); } int must_attend = max(0, total_meetings - may_skip), ans = -1; if(remote.back() >= must_attend) { ans = n - must_attend; } for(int start = 1; start + commute - 1 <= n; start++) { for(int finish = start + commute; finish + commute - 1 <= n; finish++) { /* Always attend all meetings in the office But can also attend remotes */ int attend_min = 0; attend_min += in_office[finish - 1] - in_office[start + commute - 1]; attend_min += remote[finish - 1] - remote[start + commute - 1]; int attend_extra = remote[start - 1] + (remote.back() - remote[finish + commute - 1]); int need_extra = max(must_attend - attend_min, 0); int time_home = (start - 1) + (n - (finish + commute - 1)); if(need_extra <= attend_extra) { ans = max(ans, time_home - need_extra); } } } cout << ans << '\n'; } |
English