/* * Opis: Główny nagłówek */ #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif struct Tasks { int n; string s; array<vector<int>, 3> pref; Tasks(int _n, const string& _s) : n(_n), s(_s) { REP(i, 3) { pref[i].resize(n + 1); FOR(j, 1, n) { pref[i][j] = pref[i][j-1] + (s[j-1] == '1' + i); } } } int get_num(int wh, int l, int r) { wh--; return pref[wh][r + 1] - pref[wh][l]; } }; int main() { cin.tie(0)->sync_with_stdio(0); int n, k, t; cin >> n >> k >> t; string s; cin >> s; Tasks tasks(n, s); k = max(0, tasks.get_num(1, 0, n-1) + tasks.get_num(2, 0, n-1) - k); int res = -1; if (tasks.get_num(2, 0, n-1) >= k) { res = n - k; } REP(i, n) { FOR(j, i+2*t, n-1) { int in_office = tasks.get_num(1, i+t, j-t); in_office += tasks.get_num(2, i+t, j-t); int rest = max(k - in_office, 0); int from_home = tasks.get_num(2, 0, n-1) - tasks.get_num(2, i, j); if (from_home >= rest) { res = max(res, n - (j-i+1) - rest); } } } cout << res << "\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 | /* * Opis: Główny nagłówek */ #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif struct Tasks { int n; string s; array<vector<int>, 3> pref; Tasks(int _n, const string& _s) : n(_n), s(_s) { REP(i, 3) { pref[i].resize(n + 1); FOR(j, 1, n) { pref[i][j] = pref[i][j-1] + (s[j-1] == '1' + i); } } } int get_num(int wh, int l, int r) { wh--; return pref[wh][r + 1] - pref[wh][l]; } }; int main() { cin.tie(0)->sync_with_stdio(0); int n, k, t; cin >> n >> k >> t; string s; cin >> s; Tasks tasks(n, s); k = max(0, tasks.get_num(1, 0, n-1) + tasks.get_num(2, 0, n-1) - k); int res = -1; if (tasks.get_num(2, 0, n-1) >= k) { res = n - k; } REP(i, n) { FOR(j, i+2*t, n-1) { int in_office = tasks.get_num(1, i+t, j-t); in_office += tasks.get_num(2, i+t, j-t); int rest = max(k - in_office, 0); int from_home = tasks.get_num(2, 0, n-1) - tasks.get_num(2, i, j); if (from_home >= rest) { res = max(res, n - (j-i+1) - rest); } } } cout << res << "\n"; } |