#include <iostream>
#include <cmath>
using namespace std;
struct Klocek {
unsigned int dlugosc;
unsigned int wzorek;
};
int main()
{
unsigned int n_ilosc_klockow, c_kara_wzorkowa;
cin >> n_ilosc_klockow >> c_kara_wzorkowa;
Klocek* TablicaKlockow = new Klocek[n_ilosc_klockow];
for (unsigned int nr_klocka = 0; nr_klocka < n_ilosc_klockow; nr_klocka++)
{
cin >> TablicaKlockow[nr_klocka].dlugosc >> TablicaKlockow[nr_klocka].wzorek;
//każdy kolejny klocek będzie większy lub równy poprzedniemu
}
int najlepszy_wynik = 0, aktualny_wynik;
unsigned long long kombinacja = 1;
int nr_poprzedniego_klocka;
while (kombinacja < pow(2, n_ilosc_klockow)) {
aktualny_wynik = 0;
nr_poprzedniego_klocka = -1;
for (unsigned long long aktualna_kombinacja = kombinacja, nr_klocka = 0; aktualna_kombinacja > 0; aktualna_kombinacja /= 2, nr_klocka++) {
if (aktualna_kombinacja % 2 == 0) {
continue;
}
// TablicaKlockow[nr_klocka]
if (nr_poprzedniego_klocka != -1) {
if (TablicaKlockow[nr_klocka].dlugosc <= TablicaKlockow[nr_poprzedniego_klocka].dlugosc) {
aktualny_wynik = 0;
break;
}
if (TablicaKlockow[nr_klocka].wzorek != TablicaKlockow[nr_poprzedniego_klocka].wzorek) {
aktualny_wynik -= c_kara_wzorkowa;
}
}
aktualny_wynik += TablicaKlockow[nr_klocka].dlugosc;
nr_poprzedniego_klocka = nr_klocka;
}
if (aktualny_wynik > najlepszy_wynik) {
najlepszy_wynik = aktualny_wynik;
}
kombinacja++;
}
cout << najlepszy_wynik << endl;
delete[] TablicaKlockow;
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 | #include <iostream> #include <cmath> using namespace std; struct Klocek { unsigned int dlugosc; unsigned int wzorek; }; int main() { unsigned int n_ilosc_klockow, c_kara_wzorkowa; cin >> n_ilosc_klockow >> c_kara_wzorkowa; Klocek* TablicaKlockow = new Klocek[n_ilosc_klockow]; for (unsigned int nr_klocka = 0; nr_klocka < n_ilosc_klockow; nr_klocka++) { cin >> TablicaKlockow[nr_klocka].dlugosc >> TablicaKlockow[nr_klocka].wzorek; //każdy kolejny klocek będzie większy lub równy poprzedniemu } int najlepszy_wynik = 0, aktualny_wynik; unsigned long long kombinacja = 1; int nr_poprzedniego_klocka; while (kombinacja < pow(2, n_ilosc_klockow)) { aktualny_wynik = 0; nr_poprzedniego_klocka = -1; for (unsigned long long aktualna_kombinacja = kombinacja, nr_klocka = 0; aktualna_kombinacja > 0; aktualna_kombinacja /= 2, nr_klocka++) { if (aktualna_kombinacja % 2 == 0) { continue; } // TablicaKlockow[nr_klocka] if (nr_poprzedniego_klocka != -1) { if (TablicaKlockow[nr_klocka].dlugosc <= TablicaKlockow[nr_poprzedniego_klocka].dlugosc) { aktualny_wynik = 0; break; } if (TablicaKlockow[nr_klocka].wzorek != TablicaKlockow[nr_poprzedniego_klocka].wzorek) { aktualny_wynik -= c_kara_wzorkowa; } } aktualny_wynik += TablicaKlockow[nr_klocka].dlugosc; nr_poprzedniego_klocka = nr_klocka; } if (aktualny_wynik > najlepszy_wynik) { najlepszy_wynik = aktualny_wynik; } kombinacja++; } cout << najlepszy_wynik << endl; delete[] TablicaKlockow; return 0; } |
English