#include <iostream>
#include <string>
struct Conditions {
int n;
int k;
int t;
int max;
std::string plan;
};
void hours(Conditions *cond, int time = 0, int score = 0, int misses = 0, short in_office = 0) {
if (time == cond->n) {
if (in_office != 1 && misses <= cond->k && (score > cond->max || cond->max == -1)) {
cond->max = score;
}
return;
}
if (misses > cond->k || (score + cond->n - time < cond->max && cond->max != -1)) {
return;
}
switch (in_office) {
case 0: // dom, rano
switch (cond->plan[time]) {
case '1': // spotkanie w biurze - potyczki / jazda
hours(cond, time + 1, score + 1, misses + 1, 0); // potyczki
if (time + cond->t <= cond->n) {
int delta_k = 1;
for (int i = time + 1; i < time + cond->t; i++) {
if (cond->plan[i] != '3') {
delta_k++;
}
}
hours(cond, time + cond->t, score, misses + delta_k, 1); // jazda
}
break;
case '2': // spotkanie zdalnie - potyczki / uczestnictwo / jazda
hours(cond, time + 1, score + 1, misses + 1, 0); // potyczki
hours(cond, time + 1, score, misses, 0); // uczestnictwo
if (time + cond->t <= cond->n) {
int delta_k = 1;
for (int i = time + 1; i < time + cond->t; i++) {
if (cond->plan[i] != '3') {
delta_k++;
}
}
hours(cond, time + cond->t, score, misses + delta_k, 1); // jazda
}
break;
default: // czas wolny - potyczki / jazda
hours(cond, time + 1, score + 1, misses, 0); // potyczki
if (time + cond->t <= cond->n) {
int delta_k = 0;
for (int i = time + 1; i < time + cond->t; i++) {
if (cond->plan[i] != '3') {
delta_k++;
}
}
hours(cond, time + cond->t, score, misses + delta_k, 1); // jazda
}
break;
}
break;
case 1: // biuro
switch (cond->plan[time]) {
case '1': // spotkanie w biurze - uczestnictwo / jazda
hours(cond, time + 1, score, misses, 1); // uczestnictwo
if (time + cond->t <= cond->n) {
int delta_k = 1;
for (int i = time + 1; i < time + cond->t; i++) {
if (cond->plan[i] != '3') {
delta_k++;
}
}
hours(cond, time + cond->t, score, misses + delta_k, 2); // jazda
}
break;
case '2': // spotkanie zdalnie - uczestnictwo / jazda
hours(cond, time + 1, score, misses, 1); // uczestnictwo
if (time + cond->t <= cond->n) {
int delta_k = 1;
for (int i = time + 1; i < time + cond->t; i++) {
if (cond->plan[i] != '3') {
delta_k++;
}
}
hours(cond, time + cond->t, score, misses + delta_k, 2); // jazda
}
break;
default: // czas wolny - praca / jazda
hours(cond, time + 1, score, misses, 1); // praca
if (time + cond->t <= cond->n) {
int delta_k = 0;
for (int i = time + 1; i < time + cond->t; i++) {
if (cond->plan[i] != '3') {
delta_k++;
}
}
hours(cond, time + cond->t, score, misses + delta_k, 2); // jazda
}
break;
}
break;
default: // dom, wieczorem
switch (cond->plan[time]) {
case '1': // spotkanie w biurze - potyczki
hours(cond, time + 1, score + 1, misses + 1, 2); // potyczki
break;
case '2': // spotkanie zdalnie - potyczki / uczestnictwo
hours(cond, time + 1, score + 1, misses + 1, 2); // potyczki
hours(cond, time + 1, score, misses, 2); // uczestnictwo
break;
default: // czas wolny - potyczki
hours(cond, time + 1, score + 1, misses, 2); // potyczki
break;
}
break;
}
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
Conditions cond{};
std::cin >> cond.n >> cond.k >> cond.t;
cond.max = -1;
std::cin >> cond.plan;
hours(&cond);
std::cout << cond.max;
}
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | #include <iostream> #include <string> struct Conditions { int n; int k; int t; int max; std::string plan; }; void hours(Conditions *cond, int time = 0, int score = 0, int misses = 0, short in_office = 0) { if (time == cond->n) { if (in_office != 1 && misses <= cond->k && (score > cond->max || cond->max == -1)) { cond->max = score; } return; } if (misses > cond->k || (score + cond->n - time < cond->max && cond->max != -1)) { return; } switch (in_office) { case 0: // dom, rano switch (cond->plan[time]) { case '1': // spotkanie w biurze - potyczki / jazda hours(cond, time + 1, score + 1, misses + 1, 0); // potyczki if (time + cond->t <= cond->n) { int delta_k = 1; for (int i = time + 1; i < time + cond->t; i++) { if (cond->plan[i] != '3') { delta_k++; } } hours(cond, time + cond->t, score, misses + delta_k, 1); // jazda } break; case '2': // spotkanie zdalnie - potyczki / uczestnictwo / jazda hours(cond, time + 1, score + 1, misses + 1, 0); // potyczki hours(cond, time + 1, score, misses, 0); // uczestnictwo if (time + cond->t <= cond->n) { int delta_k = 1; for (int i = time + 1; i < time + cond->t; i++) { if (cond->plan[i] != '3') { delta_k++; } } hours(cond, time + cond->t, score, misses + delta_k, 1); // jazda } break; default: // czas wolny - potyczki / jazda hours(cond, time + 1, score + 1, misses, 0); // potyczki if (time + cond->t <= cond->n) { int delta_k = 0; for (int i = time + 1; i < time + cond->t; i++) { if (cond->plan[i] != '3') { delta_k++; } } hours(cond, time + cond->t, score, misses + delta_k, 1); // jazda } break; } break; case 1: // biuro switch (cond->plan[time]) { case '1': // spotkanie w biurze - uczestnictwo / jazda hours(cond, time + 1, score, misses, 1); // uczestnictwo if (time + cond->t <= cond->n) { int delta_k = 1; for (int i = time + 1; i < time + cond->t; i++) { if (cond->plan[i] != '3') { delta_k++; } } hours(cond, time + cond->t, score, misses + delta_k, 2); // jazda } break; case '2': // spotkanie zdalnie - uczestnictwo / jazda hours(cond, time + 1, score, misses, 1); // uczestnictwo if (time + cond->t <= cond->n) { int delta_k = 1; for (int i = time + 1; i < time + cond->t; i++) { if (cond->plan[i] != '3') { delta_k++; } } hours(cond, time + cond->t, score, misses + delta_k, 2); // jazda } break; default: // czas wolny - praca / jazda hours(cond, time + 1, score, misses, 1); // praca if (time + cond->t <= cond->n) { int delta_k = 0; for (int i = time + 1; i < time + cond->t; i++) { if (cond->plan[i] != '3') { delta_k++; } } hours(cond, time + cond->t, score, misses + delta_k, 2); // jazda } break; } break; default: // dom, wieczorem switch (cond->plan[time]) { case '1': // spotkanie w biurze - potyczki hours(cond, time + 1, score + 1, misses + 1, 2); // potyczki break; case '2': // spotkanie zdalnie - potyczki / uczestnictwo hours(cond, time + 1, score + 1, misses + 1, 2); // potyczki hours(cond, time + 1, score, misses, 2); // uczestnictwo break; default: // czas wolny - potyczki hours(cond, time + 1, score + 1, misses, 2); // potyczki break; } break; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); Conditions cond{}; std::cin >> cond.n >> cond.k >> cond.t; cond.max = -1; std::cin >> cond.plan; hours(&cond); std::cout << cond.max; } |
English