#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; } |
English