Strona główna » Algorytmy » Artykuły » Wycieczka Motocyklami
 

Wycieczka Motocyklami

Zagadka

Na starcie stoi 50 motocykli. Każdy ma pełen bak co pozwala każdemu przejechać dokładnie 100km. Używając ich jak daleko możesz zajechać? Uzasadnij swoją odpowiedź.

Rozwiązanie

Odpowiedź

Używając wszystkich motocykli można przejechać 350 km (prosta metoda obliczeń).

Wyjaśnienie

W celu przedłużenia wycieczki należy przelewać paliwo pomiędzy motocyklami. W zadaniu nie ma informacji, gdzie na koniec mają zostać motocykle. Oznacza to, że można je porzucić po drodze i nie będzie to sprzeczne z zadaniem. Za każdym razem staramy się, aby do jadących dalej motocykli przelać całe paliwo z motocykli, które są przeznaczone do pozostania w trasie.

Paliwo przelewamy, gdy motory przejadą 50km. Oznacza to, że gdy jedzie nieparzysta ilość motocykli to z jednego motoru nie ma gdzie przelać paliwa. W poniższej tabelce zostało przedstawiona ilość motorów na każdym etapie oraz jaki mają zasięg.

MotorówPrzejechaliKomentarz
500Po pierwszym etapie zmniejszamy ilość o połową nie tracąc benzyny
2550Jedzie dalej 12 motocykli, jeden zostaje, więc zostaje 50km niewykorzystanego dystansu
12100Dalej jedzie 6 motocykli
6150Dalej jedą 3 motocykle
3200Dalej jedzie jeden motocykl, zostaje niewykorzystane 50km
1250Motor jest pełny, więc jedzie dalej, aż 100km
0350Koniec paliwa w ostatnim motocyklu

Jak można zauważyć w trakcie przelewania nie udało się przelać wszystkiego.

Implementacja

Poniżej została przedstawiona funkcja jakDaleko(), która pozwala obliczyć jak daleko można zajechać na pewnej ilości pojazdow, które na pełnym baku mogą przejechać zasieg kilometrów. Oczywiście należy pamiętać, że na koniec pozostaje jeden pojazd, który przejedzie cały dystans.

  1. double jakDaleko(double zasieg, int pojazdow) {
  2.   double max = 0;
  3.   while (pojazdow > 1) {
  4.     max += zasieg / 2;
  5.     pojazdow /= 2;
  6.   }
  7.   return max + zasieg;
  8. }

Testowanie funkcji

Funkcję można przetestować poprzez uruchomienie poniższego kodu i wprowadzenie odpowiednich danych:

  1. int main () {
  2.   double odl; int n;
  3.   cout << "Zasieg na pelnym baku?\n odl = ";
  4.   cin >> odl;
  5.   cout << "Ile pojazdow?\n n = ";
  6.   cin >> n;
  7.   cout << "Zasieg wynosi " << jakDaleko(odl, n) << " km";
  8.   system("pause");
  9.   return 0;
  10. }