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
#include <bits/stdc++.h>
using namespace std;

int spot[8005];
int online[8005];
int wolny[8005];

int main(){
    int n, k, d;
    string s;
    cin >> n >> k >> d >> s;

    if(s[0] == '1')	spot[0] = 1;
    if(s[0] == '2') online[0] = 1;
    if(s[0] == '3') wolny[0] = 1;

    for(int i = 1; i < n; i++){
        spot[i] = spot[i - 1];
        online[i] = online[i - 1];
        wolny[i] = wolny[i - 1];

        if(s[i] == '1') spot[i]++;
        if(s[i] == '2') online[i]++;
        if(s[i] == '3') wolny[i]++;
    }

    int job = 0, free = 0, onl = 0, res = -1;

    for(int i = 0; i < n; i++){
        if(s[i] == '1') job++;
        if(s[i] == '2') onl++;
        if(s[i] == '3') free++;
    }

    if(spot[n - 1] <= k){
        int xd = k - spot[n - 1];

        cout << wolny[n - 1] + spot[n - 1] + min(xd, online[n - 1]);
        return 0;
    }

    for(int i = 0; i < n - 2 * d; i++){
        int skip = 0, prog = 0, zdal = 0;

        if(i != 0){
            zdal = online[i - 1];
            prog = i - zdal;

            skip = spot[i - 1 + d];
            skip += online[i - 1 + d] - online[i - 1];
        }
        else{
            skip += spot[d - 1] + online[d - 1];
        }

        int it = n - 1;
        for(int j = i + d; j < n; j++) {
            if (j == n - d) {
                skip += spot[n - 1] - spot[j - 1] + online[n - 1] - online[j - 1];
                break;
            }

            if (spot[n - 1] - spot[j - 1] + online[j - 1 + d] - online[j - 1] <= k - skip) {
                it = j + d;
                skip += spot[n - 1] - spot[j - 1] + online[j - 1 + d] - online[j - 1];

                prog += wolny[n - 1] - wolny[it - 1] + spot[n - 1] - spot[it - 1];
                zdal = online[n - 1] - online[it - 1];
                break;
            }
        }

        if (skip <= k) {
            prog += min(skip - k, zdal);
            res = max(res, prog);
        }
    }

    cout << res;
    return 0;
}