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
#include <stdio.h>
#include <string>
#include <iostream>
#include <vector>
using namespace std;

int main(void){
    int n, k, t;
    int count = 0, contest = 0, max_contest = -1;
    int remaining_to_skip = 0, count_of_twos = 0;
    string day;
    scanf("%d %d %d", &n, &k, &t);
    cin >> day;
    // sprawdzamy, czy musi w ogóle wychodzić z domu
    for(int i=0; i<n; i++)
        if(day[i]=='1') count++;
    // jeśli nie musi, to liczymy ile trójek jest
    if(count <= k){
        for(int i=0; i<n; i++){
            if(day[i]=='3' || day[i]=='1') contest++;
            if(day[i]=='2') count_of_twos++;
        }
        remaining_to_skip = k - count;
        for(int i = 0; i<n; i++){
            if(day[i]=='2' && remaining_to_skip > 0){
                remaining_to_skip--;
                contest++;
            }
        }
        printf("%d\n", contest);
        return 0;
    }
    //badamy wszystkie możliwości wyjazdów i przyjazdów
    for(int i = 0; i <= n-t; i++){
        for(int j = i+t+1; j <= n-t; j++){
            count = 0;
            contest = 0;
            // liczymy ile spotkań stacjonarnych opuści poza pracą i zdalnych w podróży
            for(int l = 0; l < i+t; l++){
                if(day[l] == '1') count++;
                if(day[l] == '2' && l >= i) count++;
            }
            for(int l = j; l < n; l++){
                if(day[l] == '1') count++;
                if(day[l] == '2' && l < j+t) count++;
            }
            //jeśli opuszcza za dużo, zrezygnuj z tej opcji
            if(count > k) continue;
            //liczymy ile ma czasu na zadania poza pracą
            remaining_to_skip = k - count;
            for(int l=0; l<i; l++){
                if(day[l] == '3') contest++;
                if((day[l] == '1' || day[l] == '2' ) && remaining_to_skip > 0){
                    contest++;
                    remaining_to_skip--;
                }
            }
            for(int l=j+t; l<n; l++){
                if(day[l] == '3') contest++;
                if((day[l] == '1' || day[l] == '2' ) && remaining_to_skip > 0){
                    contest++;
                    remaining_to_skip--;
                }
            }
            //czy może pominąć jeszcze jakieś spotkania
            if(contest > max_contest) max_contest = contest;
            //printf("Wyjazd %d-%d, przyjazd %d-%d, godzin %d\n", i+1, i+t, j+1, j+t, contest);
        }
    }
    printf("%d\n", max_contest);
    return 0;
}