Najmniejsza liczba całkowita więększa od zadanej liczby - Python

0

Szkoła zdecydowała się wymienić ławki w trzech salach lekcyjnych. Przy każdym biurku siedzi dwóch uczniów. Biorąc pod uwagę liczbę uczniów w każdej klasie, wydrukuj najmniejszą możliwą liczbę ławek, które można kupić.
Program powinien odczytywać trzy liczby całkowite: liczbę uczniów w każdej z trzech klas odpowiednio a, bi c.

W pierwszym teście są trzy grupy. Pierwsza grupa liczy 20 uczniów i dlatego potrzebuje 10 ławek. Druga grupa liczy 21 uczniów, więc mogą sobie poradzić z nie mniej niż 11 ławkami. 11 ławek wystarczy również dla trzeciej grupy 22 uczniów. W sumie potrzebujemy więc 32 biurek.

Oryginał: zadanie z https://snakify.org/...s/school_desks/

Czy należy zsumować rezultaty zastosowania funkcji ceil(liczba uczniów w poszczególnej klasie / 2)?

1

Python ma też operator dzielenia w liczbach całkowitych, //, 21 // 2 = 10.

0

@lion137: Tak, ale jego zastosowanie jest nieuzasadnione w tym zadaniu, ponieważ nie istnieje możliwość dzielenia ławek na części - w sytuacji grupy na przykład 21 uczniów należy zastosować 11 ławek - a nie - 10 ławek...

1

@darek88 ale można też zrobić (liczba_uczniow+1)//2) zamiast zaokrąglać ;) Czyli w sumie sum([(x+1)//2 for x in students])

0

@Shalom: Czy mógłbym prosić o rozwinięcie Twojej koncepcji?

1

Nie wiem co chcesz tu rozwijać:

students = [20,21,22]
result = sum([(x+1)//2 for x in students])
assert result == 32

Dzieje się tak dlatego że 0//2 = 0 oraz 1//2 = 0 i 2//2 = 1 oraz 3//2 = 1

0

Jak zastosować to do mojego problemu?

1

Nie rozumiem pytania. Przecież ten kod wyżej to jest rozwiązanie twojego problemu. Brakuje tylko wczytywania liczb z wejścia do listy students i wypisywania result (zamiast asercji):

students = [int(input()) for _ in range(3)]
result = sum([(x+1)//2 for x in students])
print(result)
0

No… bezpośrednio.

Idea tutaj jest taka, że wprowadzasz „wirtualnego ucznia”, który nie musi nigdzie siedzieć (bo jest wirtualny). Więc jakbyś miał nieparzystą liczbę prawdziwych uczniów, to razem z tym wirtualnym będzie ich parzyście, więc jak wykonasz typowe dzielenie z odcięciem części ułamkowej, to wyjdzie co trzeba (bo ten wirtualny uczeń dopełni brakującą parę); a jakbyś miał parzystą, to nic nie zmieni — nie dostanie dodatkowej ławki, ale i też tej dodatkowej ławki nie potrzebował.

Przy czym nie rozumiem, czemu nie użyć po prostu math.ceil dla większej czytelności…

2

Zadanie jak z JB Academy. Aż poszukałem swojego rozwiązania:

n1 = int(input())
n2 = int(input())
n3 = int(input())
n1 = int(n1 / 2) + (n1 % 2)
n2 = int(n2 / 2) + (n2 % 2)
n3 = int(n3 / 2) + (n3 % 2)
total = n1 + n2 + n3
print(total)

https://hyperskill.org/learn/step/6462#solutions
Ale pewnie żeby zobaczyć rozwiązania trzeba się zalogować w tym stworzyć konto.
Popatrz sobie na inne rozwiązania w tym podobne do tego co napisał @Shalom
BTW.
Oczywiście lepiej użyć pętli ale na tym etapie kursu ich jeszcze nie było.

0

Dlaczego efektem mojego rozwiazania w postaciclass_a=int(input()) class_b=int(input()) class_c=int(input()) number_of_the_desks=print(ceil(class_a/2)+ceil(class_b/2)+ceil(class_c/2))

jest komunikat: "Traceback (most recent call last): NameError: name 'ceil' is not defined"?

0

Bo nie ma w builtins takiej funkcji jak ceil. Musisz zrobić import math i math.ceil albo from math import ceil i wtedy możesz używać tej nazwy w globalnym scope

0

@Shalom: Rozwiązanie jest nieprawidłowe

0

A odpalane jest na pythonie 2 czy 3? Bo W pythonie 2 operator / robił integer division czyli to co // w pythonie 3. Użyj rozwiązanie które podałem wyżej...

0

ceil zwraca floata więc da ci wynik np. 32.0 zamiast 32. Zrzutuj wynik na inta skoro koniecznie musisz użyc ceil...
Ale przemyśl sprawę, bo informatyka chyba nie jest dla ciebie...

0

Rzutowałem i już wcześniej i też było źle

2

No to nie ma rady. Koniec twoich marzeń o zostaniu programistą. Wątek do zamknięcia.

0

Problem został już rozwiązany

1 użytkowników online, w tym zalogowanych: 0, gości: 1