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"; 

}