#include <iostream> #include <vector> using namespace std; int main() { int n,k,t; cin>>n>>k>>t; // zliczanie spotkan vector<int> ileBiu(n,0), ileOnl(n,0); char seg; for (int i=0; i<n; i++){ if (i>0){ ileBiu[i] = ileBiu[i-1]; ileOnl[i] = ileOnl[i-1]; } cin>>seg; if (seg=='1'){ ileBiu[i]++; } else if (seg=='2'){ ileOnl[i]++; } } // sprawdzenie czy wyjazd z domu jest potrzebny if (ileBiu[n-1] <=k){ int moznaOpuscic = k - ileBiu[n-1]; int spotOnline = max(ileOnl[n-1] - moznaOpuscic, 0); int wolne = n - spotOnline; cout<< wolne<<endl; return 0; } // szukanie optymalnej godziny wyjazdu i powrotu int odp = -1; for (int i=0; i<n-2*t; i++) for(int j=i+t+1; j<n-t+1; j++){ // jazda do pracy w segmentach [i, i+t-1], powrot w segmentach [j, j+t-1] // przepadaja spotkania biurowe w drodze i w domu oraz spotkania online w drodze int przepadaB1 = ileBiu[i+t-1]; int przepadaB2 = ileBiu[n-1] - ileBiu[j-1]; int przepadaO1 = ileOnl[i+t-1]; if (i>0){ przepadaO1 -= ileOnl[i-1];} int przepadaO2 = ileOnl[j+t-1] - ileOnl[j-1]; int przepada = przepadaB1 + przepadaB2 + przepadaO1 + przepadaO2; if (przepada <=k){ int moznaOpuscic = k - przepada; int spotOnline = ileOnl[n-1] - ileOnl[j+t-1]; if (i>0){ spotOnline += ileOnl[i-1];} int czasDom = i + n-(j+t); int wolne = czasDom - max(spotOnline - moznaOpuscic, 0); odp = max(odp, wolne); break; } } cout<<odp<<endl; 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 | #include <iostream> #include <vector> using namespace std; int main() { int n,k,t; cin>>n>>k>>t; // zliczanie spotkan vector<int> ileBiu(n,0), ileOnl(n,0); char seg; for (int i=0; i<n; i++){ if (i>0){ ileBiu[i] = ileBiu[i-1]; ileOnl[i] = ileOnl[i-1]; } cin>>seg; if (seg=='1'){ ileBiu[i]++; } else if (seg=='2'){ ileOnl[i]++; } } // sprawdzenie czy wyjazd z domu jest potrzebny if (ileBiu[n-1] <=k){ int moznaOpuscic = k - ileBiu[n-1]; int spotOnline = max(ileOnl[n-1] - moznaOpuscic, 0); int wolne = n - spotOnline; cout<< wolne<<endl; return 0; } // szukanie optymalnej godziny wyjazdu i powrotu int odp = -1; for (int i=0; i<n-2*t; i++) for(int j=i+t+1; j<n-t+1; j++){ // jazda do pracy w segmentach [i, i+t-1], powrot w segmentach [j, j+t-1] // przepadaja spotkania biurowe w drodze i w domu oraz spotkania online w drodze int przepadaB1 = ileBiu[i+t-1]; int przepadaB2 = ileBiu[n-1] - ileBiu[j-1]; int przepadaO1 = ileOnl[i+t-1]; if (i>0){ przepadaO1 -= ileOnl[i-1];} int przepadaO2 = ileOnl[j+t-1] - ileOnl[j-1]; int przepada = przepadaB1 + przepadaB2 + przepadaO1 + przepadaO2; if (przepada <=k){ int moznaOpuscic = k - przepada; int spotOnline = ileOnl[n-1] - ileOnl[j+t-1]; if (i>0){ spotOnline += ileOnl[i-1];} int czasDom = i + n-(j+t); int wolne = czasDom - max(spotOnline - moznaOpuscic, 0); odp = max(odp, wolne); break; } } cout<<odp<<endl; return 0; } |