#include <bits/stdc++.h> #define debug(x) cout<<#x<<" = "<<x<<"\n" #define pb push_back #define ins insert #define fi first #define se second using namespace std; using ull = unsigned long long; using ll = long long; using ld = long double; template <typename H, typename T> ostream& operator<<(ostream& os, pair<H, T> m){ return os <<"("<< m.fi<<", "<<m.se<<")"; } template <typename H> ostream& operator<<(ostream& os, vector<H> V){ os<<"{"; for(int i=0; i<V.size(); i++){ if(i)os<<" "; os<<V[i]; } os<<"}"; return os; } void solve(); int main(){ // ios_base::sync_with_stdio(false); // cin.tie(NULL); int t = 1; //cin>>t; while(t--) solve(); return 0; } int pref[8050]; char oper[8050]; void solve(){ int n,k,t; cin>>n>>k>>t; int l2 = 0; for(int i = 1; i <= n; i++) cin>>oper[i]; for(int i = 1; i <= n; i++) if(oper[i] == '2') l2++; pref[0] = 0; for(int i = 1; i <= n; i++){ if(oper[i] == '1' || oper[i] == '2'){ pref[i] = pref[i-1]+1; }else{ pref[i] = pref[i-1]; } } k = max(0,pref[n] - k); if(l2 >= k){ cout<< n - k <<"\n"; return; } int odp = -1; int spotkanprzed = 0; int spotkanpo = 0; //liczy potencjalne spotkania int spotkanw = 0; for(int i = 1; i <= n; i++){ //i - o i-godzinie wyrusza int jestwpracy = i+t; if(i > 1) if(oper[i-1] == '2') spotkanprzed++; spotkanpo = 0; for(int j = n; j >= 1; j--){ // o j-tej godzinie jest znowu w domu int konczyprace = j - t; if(j < n) if(oper[j+1] == '2') spotkanpo++; if(konczyprace < jestwpracy) break; spotkanw = pref[konczyprace] - pref[jestwpracy-1]; if(spotkanw+spotkanpo+spotkanprzed >= k){ odp = max(odp, n - (j-i+1)- (k - spotkanw)); } } } cout<<odp<<"\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 88 89 90 91 92 | #include <bits/stdc++.h> #define debug(x) cout<<#x<<" = "<<x<<"\n" #define pb push_back #define ins insert #define fi first #define se second using namespace std; using ull = unsigned long long; using ll = long long; using ld = long double; template <typename H, typename T> ostream& operator<<(ostream& os, pair<H, T> m){ return os <<"("<< m.fi<<", "<<m.se<<")"; } template <typename H> ostream& operator<<(ostream& os, vector<H> V){ os<<"{"; for(int i=0; i<V.size(); i++){ if(i)os<<" "; os<<V[i]; } os<<"}"; return os; } void solve(); int main(){ // ios_base::sync_with_stdio(false); // cin.tie(NULL); int t = 1; //cin>>t; while(t--) solve(); return 0; } int pref[8050]; char oper[8050]; void solve(){ int n,k,t; cin>>n>>k>>t; int l2 = 0; for(int i = 1; i <= n; i++) cin>>oper[i]; for(int i = 1; i <= n; i++) if(oper[i] == '2') l2++; pref[0] = 0; for(int i = 1; i <= n; i++){ if(oper[i] == '1' || oper[i] == '2'){ pref[i] = pref[i-1]+1; }else{ pref[i] = pref[i-1]; } } k = max(0,pref[n] - k); if(l2 >= k){ cout<< n - k <<"\n"; return; } int odp = -1; int spotkanprzed = 0; int spotkanpo = 0; //liczy potencjalne spotkania int spotkanw = 0; for(int i = 1; i <= n; i++){ //i - o i-godzinie wyrusza int jestwpracy = i+t; if(i > 1) if(oper[i-1] == '2') spotkanprzed++; spotkanpo = 0; for(int j = n; j >= 1; j--){ // o j-tej godzinie jest znowu w domu int konczyprace = j - t; if(j < n) if(oper[j+1] == '2') spotkanpo++; if(konczyprace < jestwpracy) break; spotkanw = pref[konczyprace] - pref[jestwpracy-1]; if(spotkanw+spotkanpo+spotkanprzed >= k){ odp = max(odp, n - (j-i+1)- (k - spotkanw)); } } } cout<<odp<<"\n"; } |