21. Milioner - REŠENJE ZADATKA
Uvod
Zadatak "Milioner" inspirisan je popularnim kvizom "Želite li da postanete milioner?" u kojem takmičari odgovaraju na pitanja sa četiri ponuđena odgovora. Takmičari imaju na raspolaganju tri pomoći: pomoć publike, pola-pola i pozovi prijatelja. Cilj ovog zadatka je simulacija donošenja odluke takmičara na osnovu ovih pomoći.
Darko se našao pred pretposlednjim pitanjem i odlučio je da iskoristi svoju strategiju kombinovanja ovih pomoći kako bi došao do konačnog odgovora. Vaš zadatak je da, prateći njegovu taktiku, odredite koji odgovor će Darko dati.
Uputstvo za rešavanje
- Unos podataka:
- Na prvom redu ulaza uneti četiri cela broja koji predstavljaju broj glasova publike za odgovore
a
,b
,c
id
. Svi brojevi su između 0 i 100 i njihov zbir je 100. - Ako Darko nije dao odgovor na osnovu pomoći publike, u drugom redu ulaza uneti dva različita slova koja predstavljaju odgovore koje računar ostavlja nakon pomoći pola-pola.
- Ako ni tada nije moguće doneti odluku, u trećem redu ulaza uneti jedno slovo koje predstavlja predlog prijatelja.
- Na prvom redu ulaza uneti četiri cela broja koji predstavljaju broj glasova publike za odgovore
- Pomoć publike:
- Izračunajte zbir glasova publike za sve odgovore.
- Proverite da li jedan od odgovora ima više glasova od zbira ostalih. Ako takav odgovor postoji, odmah ga ispišite i završite izvršavanje programa.
- Pola-pola:
- Računar ostavlja dva odgovora. Proverite razliku glasova između ta dva odgovora.
- Ako razlika iznosi barem 20 glasova, izaberite odgovor sa većim brojem glasova i završite program.
- Pomoć prijatelja:
- Ako ni nakon druge pomoći nije moguće doneti odluku, pročitajte predlog prijatelja i ispišite njegov izbor.
- Izlaz:
- Na izlazu ispisati konačan odgovor (jedno slovo:
a
,b
,c
, ilid
).
- Na izlazu ispisati konačan odgovor (jedno slovo:
#include <iostream> // Omogućava rad sa ulazom i izlazom #include <cmath> // Omogućava korišćenje matematičkih funkcija poput abs using namespace std; // Koristi standardni prostor imena int main() { int a[4]; // Deklariše niz od 4 celobrojna elementa string o[4] = {"a", "b", "c", "d"}; // Oznake za svaki element niza bool najveci = false; // Pokazuje da li postoji element veći od zbira ostalih for(int i = 0; i < 4; i++) { cin >> a[i]; // Unos elemenata u niz } for(int i = 0; i < 4; i++) { // Računanje zbira svih elemenata osim trenutnog int zb = 0; for(int j = 0; j < 4; j++) { if(j != i) { zb += a[j]; // Dodaje vrednost ako nije trenutni element } } if(a[i] > zb) { cout << o[i] << endl; // Ispisuje oznaku elementa većeg od zbira ostalih najveci = true; break; // Prekida dalju proveru } } if(najveci) { return 0; // Završava program ako je nađen najveći element } string polaOd[2]; // Čuva dva elementa za poređenje cin >> polaOd[0] >> polaOd[1]; // Unos oznaka za poređenje int rbMax = -1, rbMax2 = -1; for(int i = 0; i < 4; i++) { if(o[i] == polaOd[0]) { rbMax = i; // Čuva indeks prvog elementa } if(o[i] == polaOd[1]) { rbMax2 = i; // Čuva indeks drugog elementa } } int raz = abs(a[rbMax2] - a[rbMax]); // Računa apsolutnu razliku if(raz >= 20) { if(a[rbMax2] > a[rbMax]) { cout << o[rbMax2] << endl; // Ispisuje oznaku većeg elementa } else { cout << o[rbMax] << endl; } } else { string odg; cin >> odg; // Unos dodatnog odgovora cout << odg << endl; // Ispisuje unos korisnika } return 0; // Završava program }
Rešenje 2
#include <iostream> // Omogućava rad sa ulazom i izlazom #include <vector> // Omogućava rad sa vektorima #include <string> // Omogućava rad sa stringovima #include <algorithm> // Omogućava rad sa algoritmima poput sortiranja using namespace std; // Koristi standardni prostor imena int main() { // Broj glasova za odgovore a, b, c, i d vector<int> glasovi(4); cin >> glasovi[0] >> glasovi[1] >> glasovi[2] >> glasovi[3]; // Koraci za pomoć publike int suma = glasovi[0] + glasovi[1] + glasovi[2] + glasovi[3]; for (int i = 0; i < 4; ++i) { if (glasovi[i] > suma - glasovi[i]) { cout << (char)('a' + i) << endl; return 0; } } // Koraci za pola-pola char prvi, drugi; cin >> prvi >> drugi; int indeks1 = prvi - 'a'; int indeks2 = drugi - 'a'; if (abs(glasovi[indeks1] - glasovi[indeks2]) >= 20) { cout << (glasovi[indeks1] > glasovi[indeks2] ? prvi : drugi) << endl; return 0; } // Koraci za pomoć prijatelja char odgovorPrijatelja; cin >> odgovorPrijatelja; cout << odgovorPrijatelja << endl; return 0; }
- Unos glasova publike: Čitamo četiri broja koji predstavljaju broj glasova za odgovore
a
,b
,c
id
. - Pomoć publike:
- Izračunavamo zbir svih glasova.
- Proveravamo da li jedan odgovor ima više glasova nego svi ostali zajedno (
glasovi[i] > suma - glasovi[i]
). - Ako uslov važi, odmah ispisujemo taj odgovor i završavamo program.
- Pola-pola:
- Čitamo dva odgovora koja su preostala nakon korišćenja pomoći pola-pola.
- Računamo razliku broja glasova za ta dva odgovora.
- Ako razlika iznosi barem 20, biramo odgovor sa više glasova.
- Pomoć prijatelja:
- Ako nijedan odgovor ne ispunjava uslove prethodnih koraka, čitamo predlog prijatelja i njega biramo kao konačan odgovor.