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
 96
 97
 98
 99
100
101
102
#include <iostream>


int calculateMaxValue(char *obowiazki, int n, int t)
{
    int liczba3 = 0;
    bool liczba1 = false; 
    int minus = 0;
    for (int i = 0; i < n; i++)
    {
        if (obowiazki[i] == '3')
            liczba3++;
        if (obowiazki[i] == '1'){
            int counter = 0;
            for(int j = i; j<i+t+1; j++){
                if (obowiazki[j] == '3') counter++;
                else if (obowiazki[j] == '2') minus+=counter;
            } 
            for(int j = i; j>i-t-1; j--){
                if (obowiazki[j] == '3') counter++;
                else if (obowiazki[j] == '2') minus+=counter;
            } 
            liczba1 = true;
        }
            
    }
    if(liczba1) minus+=t*2;
    return liczba3 - minus;
}

void generateCombinations(char *obowiazki, int n, int k, int start, int changes, int t, int &maxValue)
{
    if (changes == k)
    {   
        int currentValue = calculateMaxValue(obowiazki, n, t);
        maxValue = maxValue < currentValue ? currentValue : maxValue;
        return;
    }

    for (int i = start; i < n; i++)
    {
        if (obowiazki[i] == '1' || obowiazki[i] == '2')
        {
            char origynal = obowiazki[i];
            obowiazki[i] = '3';
            generateCombinations(obowiazki, n, k, i + 1, changes + 1, t, maxValue);
            obowiazki[i] = origynal;
        }
    }
}


int main(){
    int n,k,t;
    scanf("%d", &n);
    scanf("%d", &k);
    scanf("%d", &t);
    char *obowiazki = new char[n]();
    int liczbaObowiazkow = 0;
    for(int i = 0; i<n; i++){
        scanf(" %c", &obowiazki[i]);
        if(obowiazki[i] == '1' || obowiazki[i] == '2') liczbaObowiazkow++;
    }

    if(liczbaObowiazkow<=k){
        printf("%d", n);
        return 0;
    }
    if(k>0){
    
    
        for(int i = 0; i<t; i++){
            if(obowiazki[i] == '1'){
                obowiazki[i] = '3';
                k--;
                liczbaObowiazkow--;
                if(0 > k){
                    printf("-1");
                    return 0;
                }
            }
            if(obowiazki[n-i-1] == '1'){
                obowiazki[n-i-1] = '3';
                k--;
                liczbaObowiazkow--;
                if(0 > k){
                    printf("-1");
                    return 0;
                }
            }
        }
    }


    int maxValue = -1;
    generateCombinations(obowiazki, n, k, 0, 0, t, maxValue);

    printf("%d", maxValue);

    delete[] obowiazki;
    return 0;
}