#include<bits/stdc++.h>
using namespace std;
const int MN = 8005;
int sta[MN], zdal[MN], wol[MN];
int main(){
int n, k, t;
cin >> n >> k >> t;
string ciag;
cin >> ciag;
int spotkan = 0;
sta[0] = 0; zdal[0] = 0; wol[0] = 0;
for(int i = 1; i <= n; i++){
sta[i] = sta[i-1];
zdal[i] = zdal[i-1];
wol[i] = wol[i-1];
if(ciag[i-1] == '1')
sta[i]++;
if(ciag[i-1] == '2')
zdal[i]++;
if(ciag[i-1] == '3')
wol[i]++;
}
spotkan = sta[n] + zdal[n];
if(zdal[n] >= spotkan-k){
// nie trzeba jechac do biura
cout << n - max((spotkan-k), 0) << "\n";
return 0;
}
int min_spot = max(spotkan -k,0);
int best_res = -1;
// [l-t, l-1], [r+1, r+t] -- jechanie
// [1, l-t-1], [r+t+1, n] -- dom
//cout << "begin: " << 1+t << " " << n-t << "\n";
for(int l = 1+t; l <= n-t; l++){
for(int r = l; r <= n-t; r++){
if(sta[r] - sta[l-1] + zdal[r] - zdal[l-1] + zdal[l-t-1] + zdal[n] - zdal[r+t] >= min_spot){
if(zdal[l-t] + zdal[n]-zdal[r+t] >= min_spot - (sta[r]-sta[l-1]) - (zdal[r] - zdal[l-1]))
best_res = max(best_res, (n - (r+t)) + (l-t-1) - max(0,(min_spot- (sta[r]-sta[l-1])-(zdal[r]-zdal[l-1])) ) );
// [calosc wolnego] - [ile spotkan brakuje]
// // moze byc lipa, trzeba zrobic tak ze sprawdzasz
// czy w pozostalej czesci faktycznie jest wystarczajaco duzo zdal
}
}
}
cout << best_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 | #include<bits/stdc++.h> using namespace std; const int MN = 8005; int sta[MN], zdal[MN], wol[MN]; int main(){ int n, k, t; cin >> n >> k >> t; string ciag; cin >> ciag; int spotkan = 0; sta[0] = 0; zdal[0] = 0; wol[0] = 0; for(int i = 1; i <= n; i++){ sta[i] = sta[i-1]; zdal[i] = zdal[i-1]; wol[i] = wol[i-1]; if(ciag[i-1] == '1') sta[i]++; if(ciag[i-1] == '2') zdal[i]++; if(ciag[i-1] == '3') wol[i]++; } spotkan = sta[n] + zdal[n]; if(zdal[n] >= spotkan-k){ // nie trzeba jechac do biura cout << n - max((spotkan-k), 0) << "\n"; return 0; } int min_spot = max(spotkan -k,0); int best_res = -1; // [l-t, l-1], [r+1, r+t] -- jechanie // [1, l-t-1], [r+t+1, n] -- dom //cout << "begin: " << 1+t << " " << n-t << "\n"; for(int l = 1+t; l <= n-t; l++){ for(int r = l; r <= n-t; r++){ if(sta[r] - sta[l-1] + zdal[r] - zdal[l-1] + zdal[l-t-1] + zdal[n] - zdal[r+t] >= min_spot){ if(zdal[l-t] + zdal[n]-zdal[r+t] >= min_spot - (sta[r]-sta[l-1]) - (zdal[r] - zdal[l-1])) best_res = max(best_res, (n - (r+t)) + (l-t-1) - max(0,(min_spot- (sta[r]-sta[l-1])-(zdal[r]-zdal[l-1])) ) ); // [calosc wolnego] - [ile spotkan brakuje] // // moze byc lipa, trzeba zrobic tak ze sprawdzasz // czy w pozostalej czesci faktycznie jest wystarczajaco duzo zdal } } } cout << best_res << "\n"; } |
English