#include <iostream>
#include <string>
#define pracaBiuro 1
#define pracaZdalne 2
#define pracaWolne 3
using namespace std;
int main()
{
unsigned short n_liczba_segmentow, k_maksymalna_liczba_spotkan_do_opuszczenia, t_czas_jazdy;
cin >> n_liczba_segmentow >> k_maksymalna_liczba_spotkan_do_opuszczenia >> t_czas_jazdy;
string slowo_obowiazkow;
cin >> slowo_obowiazkow;
unsigned short* lista_obowiazkow = new unsigned short[n_liczba_segmentow];
for (unsigned short cyfra = 0; cyfra < n_liczba_segmentow; cyfra++)
{
lista_obowiazkow[cyfra] = slowo_obowiazkow[cyfra] - '0';
}
short najwieksza_liczba_zadan = -1, aktualna_liczba_zadan = 0, aktualnie_opuszczone_spotkania = k_maksymalna_liczba_spotkan_do_opuszczenia, zdalne_niepotrzebne = 0;
// wstepna analiza - zostanie w domu caly dzien
for (unsigned short nr_obowiazku = 0; nr_obowiazku < n_liczba_segmentow; nr_obowiazku++) {
if (aktualnie_opuszczone_spotkania == -1) {
break;
}
switch (lista_obowiazkow[nr_obowiazku]) {
case pracaBiuro:
aktualnie_opuszczone_spotkania--;
case pracaWolne:
aktualna_liczba_zadan++;
break;
case pracaZdalne:
zdalne_niepotrzebne++;
break;
}
}
if (aktualnie_opuszczone_spotkania != -1) {
if (zdalne_niepotrzebne > aktualnie_opuszczone_spotkania) {
zdalne_niepotrzebne = aktualnie_opuszczone_spotkania;
}
aktualna_liczba_zadan += zdalne_niepotrzebne;
najwieksza_liczba_zadan = aktualna_liczba_zadan;
//cout << "Starter zadan (zostanie w domu): " << najwieksza_liczba_zadan << endl;
}
// analiza wyjazdu do pracy
for (unsigned short wyjazd_do_pracy = 0; wyjazd_do_pracy < n_liczba_segmentow - (2*t_czas_jazdy+1); wyjazd_do_pracy++) {
for (unsigned short powrot_do_domu = wyjazd_do_pracy + t_czas_jazdy+1; powrot_do_domu <= n_liczba_segmentow - t_czas_jazdy; powrot_do_domu++) {
aktualna_liczba_zadan = 0;
aktualnie_opuszczone_spotkania = k_maksymalna_liczba_spotkan_do_opuszczenia;
// rozpoczęcie próby
for (unsigned short nr_obowiazku = 0; nr_obowiazku < n_liczba_segmentow; nr_obowiazku++) {
if (aktualnie_opuszczone_spotkania == -1) {
break;
}
// przed pracą
if (nr_obowiazku < wyjazd_do_pracy) {
switch (lista_obowiazkow[nr_obowiazku]) {
case pracaBiuro:
aktualnie_opuszczone_spotkania--;
case pracaWolne:
aktualna_liczba_zadan++;
break;
case pracaZdalne :
zdalne_niepotrzebne++;
break;
}
}
// t godzin czasu jazdy do pracy
else if (nr_obowiazku < wyjazd_do_pracy + t_czas_jazdy) {
if (lista_obowiazkow[nr_obowiazku] == pracaBiuro || lista_obowiazkow[nr_obowiazku] == pracaZdalne) {
aktualnie_opuszczone_spotkania--;
}
continue;
}
// w pracy
else if (nr_obowiazku < powrot_do_domu) {
continue;
}
// t godzin czasu jazdy do domu
else if (nr_obowiazku < powrot_do_domu + t_czas_jazdy) {
if (lista_obowiazkow[nr_obowiazku] == pracaBiuro || lista_obowiazkow[nr_obowiazku] == pracaZdalne) {
aktualnie_opuszczone_spotkania--;
}
continue;
}
//po pracy
else {
switch (lista_obowiazkow[nr_obowiazku]) {
case pracaBiuro:
aktualnie_opuszczone_spotkania--;
case pracaWolne:
aktualna_liczba_zadan++;
break;
case pracaZdalne:
zdalne_niepotrzebne++;
break;
}
}
}
if (aktualnie_opuszczone_spotkania == -1) {
continue;
}
if (zdalne_niepotrzebne > aktualnie_opuszczone_spotkania) {
zdalne_niepotrzebne = aktualnie_opuszczone_spotkania;
}
aktualna_liczba_zadan += zdalne_niepotrzebne;
if (aktualna_liczba_zadan > najwieksza_liczba_zadan) {
//cout << "Aktualizacja liczby zadan: " << najwieksza_liczba_zadan << " -> " << aktualna_liczba_zadan << " dla wyjazdu do pracy o godzinie: " << wyjazd_do_pracy+1 << " i powrotu z pracy o godzinie: " << powrot_do_domu+1 << endl;
najwieksza_liczba_zadan = aktualna_liczba_zadan;
}
}
}
cout << najwieksza_liczba_zadan;
delete[] lista_obowiazkow;
return 0;
}
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 | #include <iostream> #include <string> #define pracaBiuro 1 #define pracaZdalne 2 #define pracaWolne 3 using namespace std; int main() { unsigned short n_liczba_segmentow, k_maksymalna_liczba_spotkan_do_opuszczenia, t_czas_jazdy; cin >> n_liczba_segmentow >> k_maksymalna_liczba_spotkan_do_opuszczenia >> t_czas_jazdy; string slowo_obowiazkow; cin >> slowo_obowiazkow; unsigned short* lista_obowiazkow = new unsigned short[n_liczba_segmentow]; for (unsigned short cyfra = 0; cyfra < n_liczba_segmentow; cyfra++) { lista_obowiazkow[cyfra] = slowo_obowiazkow[cyfra] - '0'; } short najwieksza_liczba_zadan = -1, aktualna_liczba_zadan = 0, aktualnie_opuszczone_spotkania = k_maksymalna_liczba_spotkan_do_opuszczenia, zdalne_niepotrzebne = 0; // wstepna analiza - zostanie w domu caly dzien for (unsigned short nr_obowiazku = 0; nr_obowiazku < n_liczba_segmentow; nr_obowiazku++) { if (aktualnie_opuszczone_spotkania == -1) { break; } switch (lista_obowiazkow[nr_obowiazku]) { case pracaBiuro: aktualnie_opuszczone_spotkania--; case pracaWolne: aktualna_liczba_zadan++; break; case pracaZdalne: zdalne_niepotrzebne++; break; } } if (aktualnie_opuszczone_spotkania != -1) { if (zdalne_niepotrzebne > aktualnie_opuszczone_spotkania) { zdalne_niepotrzebne = aktualnie_opuszczone_spotkania; } aktualna_liczba_zadan += zdalne_niepotrzebne; najwieksza_liczba_zadan = aktualna_liczba_zadan; //cout << "Starter zadan (zostanie w domu): " << najwieksza_liczba_zadan << endl; } // analiza wyjazdu do pracy for (unsigned short wyjazd_do_pracy = 0; wyjazd_do_pracy < n_liczba_segmentow - (2*t_czas_jazdy+1); wyjazd_do_pracy++) { for (unsigned short powrot_do_domu = wyjazd_do_pracy + t_czas_jazdy+1; powrot_do_domu <= n_liczba_segmentow - t_czas_jazdy; powrot_do_domu++) { aktualna_liczba_zadan = 0; aktualnie_opuszczone_spotkania = k_maksymalna_liczba_spotkan_do_opuszczenia; // rozpoczęcie próby for (unsigned short nr_obowiazku = 0; nr_obowiazku < n_liczba_segmentow; nr_obowiazku++) { if (aktualnie_opuszczone_spotkania == -1) { break; } // przed pracą if (nr_obowiazku < wyjazd_do_pracy) { switch (lista_obowiazkow[nr_obowiazku]) { case pracaBiuro: aktualnie_opuszczone_spotkania--; case pracaWolne: aktualna_liczba_zadan++; break; case pracaZdalne : zdalne_niepotrzebne++; break; } } // t godzin czasu jazdy do pracy else if (nr_obowiazku < wyjazd_do_pracy + t_czas_jazdy) { if (lista_obowiazkow[nr_obowiazku] == pracaBiuro || lista_obowiazkow[nr_obowiazku] == pracaZdalne) { aktualnie_opuszczone_spotkania--; } continue; } // w pracy else if (nr_obowiazku < powrot_do_domu) { continue; } // t godzin czasu jazdy do domu else if (nr_obowiazku < powrot_do_domu + t_czas_jazdy) { if (lista_obowiazkow[nr_obowiazku] == pracaBiuro || lista_obowiazkow[nr_obowiazku] == pracaZdalne) { aktualnie_opuszczone_spotkania--; } continue; } //po pracy else { switch (lista_obowiazkow[nr_obowiazku]) { case pracaBiuro: aktualnie_opuszczone_spotkania--; case pracaWolne: aktualna_liczba_zadan++; break; case pracaZdalne: zdalne_niepotrzebne++; break; } } } if (aktualnie_opuszczone_spotkania == -1) { continue; } if (zdalne_niepotrzebne > aktualnie_opuszczone_spotkania) { zdalne_niepotrzebne = aktualnie_opuszczone_spotkania; } aktualna_liczba_zadan += zdalne_niepotrzebne; if (aktualna_liczba_zadan > najwieksza_liczba_zadan) { //cout << "Aktualizacja liczby zadan: " << najwieksza_liczba_zadan << " -> " << aktualna_liczba_zadan << " dla wyjazdu do pracy o godzinie: " << wyjazd_do_pracy+1 << " i powrotu z pracy o godzinie: " << powrot_do_domu+1 << endl; najwieksza_liczba_zadan = aktualna_liczba_zadan; } } } cout << najwieksza_liczba_zadan; delete[] lista_obowiazkow; return 0; } |
English