#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n,k,t;
cin>>n>>k>>t;
string day;
cin>>day;
int office=0;
int zdalnych =0;
for (char c: day){
if (c=='1')
office++;
else if (c=='2')
zdalnych++;
}
if (office <= k ){
cout<< n - max((office + zdalnych - k),0)<<endl;
return 0;
}
vector<int> pominietych(n+1), opcjonalnych(n+1),//w pracy od chwili t
rpominietych(n+1), ropcjonalnych(n+1);
if ( day[0]!='3' )
pominietych[0]=1;
for (int i=1; i<t; i++){
if ( day[i]!='3' )
pominietych[i]=pominietych[i-1]+1;
else
pominietych[i]=pominietych[i-1];
}
for (int i=t; i<day.size()-t; i++){
if ( day[i]!='3' )
pominietych[i]=pominietych[i-1]+1;
else
pominietych[i]=pominietych[i-1];
opcjonalnych[i] = opcjonalnych[i-1];
if (day[i-t]=='2'){
pominietych[i]--;
opcjonalnych[i]++;
}
}
if ( day[n-1]!='3' )
rpominietych[n-1]=1;
for (int i=n-2; i>=n-t; i--){
if ( day[i]!='3' )
rpominietych[i]=rpominietych[i+1]+1;
else
rpominietych[i]=rpominietych[i+1];
}
for (int i=n-1-t; i>=t; i--){
if ( day[i]!='3' )
rpominietych[i]=rpominietych[i+1]+1;
else
rpominietych[i]=rpominietych[i+1];
ropcjonalnych[i] = ropcjonalnych[i+1];
if (day[i+t]=='2'){
rpominietych[i]--;
ropcjonalnych[i]++;
}
}
int best = -1;
for (int i=t-1;i<n-t;i++){
for (int j=i+1; j<=n-t;j++){
if (pominietych[i]+rpominietych[j] > k){
continue;
}
int do_pominiecia = k - (pominietych[i]+rpominietych[j]);
int opt = opcjonalnych[i]+ropcjonalnych[j];
int w_domu = i-t +1 + n - t -j;
int wolne = w_domu - max(opt - do_pominiecia,0);
if (wolne>best)
best = wolne;
}
}
cout<<best<<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 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 93 94 95 | #include <iostream> #include <vector> using namespace std; int main() { int n,k,t; cin>>n>>k>>t; string day; cin>>day; int office=0; int zdalnych =0; for (char c: day){ if (c=='1') office++; else if (c=='2') zdalnych++; } if (office <= k ){ cout<< n - max((office + zdalnych - k),0)<<endl; return 0; } vector<int> pominietych(n+1), opcjonalnych(n+1),//w pracy od chwili t rpominietych(n+1), ropcjonalnych(n+1); if ( day[0]!='3' ) pominietych[0]=1; for (int i=1; i<t; i++){ if ( day[i]!='3' ) pominietych[i]=pominietych[i-1]+1; else pominietych[i]=pominietych[i-1]; } for (int i=t; i<day.size()-t; i++){ if ( day[i]!='3' ) pominietych[i]=pominietych[i-1]+1; else pominietych[i]=pominietych[i-1]; opcjonalnych[i] = opcjonalnych[i-1]; if (day[i-t]=='2'){ pominietych[i]--; opcjonalnych[i]++; } } if ( day[n-1]!='3' ) rpominietych[n-1]=1; for (int i=n-2; i>=n-t; i--){ if ( day[i]!='3' ) rpominietych[i]=rpominietych[i+1]+1; else rpominietych[i]=rpominietych[i+1]; } for (int i=n-1-t; i>=t; i--){ if ( day[i]!='3' ) rpominietych[i]=rpominietych[i+1]+1; else rpominietych[i]=rpominietych[i+1]; ropcjonalnych[i] = ropcjonalnych[i+1]; if (day[i+t]=='2'){ rpominietych[i]--; ropcjonalnych[i]++; } } int best = -1; for (int i=t-1;i<n-t;i++){ for (int j=i+1; j<=n-t;j++){ if (pominietych[i]+rpominietych[j] > k){ continue; } int do_pominiecia = k - (pominietych[i]+rpominietych[j]); int opt = opcjonalnych[i]+ropcjonalnych[j]; int w_domu = i-t +1 + n - t -j; int wolne = w_domu - max(opt - do_pominiecia,0); if (wolne>best) best = wolne; } } cout<<best<<endl; return 0; } |
English