Skip to content

Latest commit

 

History

History
586 lines (434 loc) · 49.4 KB

chapter-05-loops-exam-problems.md

File metadata and controls

586 lines (434 loc) · 49.4 KB

Глава 5.2. Повторения (цикли) – изпитни задачи

В предходната глава научихме как да изпълним даден блок от команди повече от веднъж. Затова въведохме for цикъл и разгледахме някои от основните му приложения. Целта на настоящата глава е да затвърдим знанията си, решавайки няколко по-сложни задачи с цикли, давани на приемни изпити. За някои от тях ще покажем примерни подробни решения, а за други ще оставим само напътствия. Преди да се захванем за работа е добре да си припомним конструкцията на цикъла for:

for циклите се състоят от:

  • Инициализационен блок, в който се декларира променливата-брояч (i) и с помощта на вградената функция range(…) в Python, определяме каква да бъде началната и крайната ѝ стойност.
  • Обновяване на брояча – подава се като трети параметър на функцията range(…) и указва с каква стъпка да се обновява променливата-брояч.
  • Тяло на цикъла - съдържа произволен блок със сорс код.

Изпитни задачи

Да решим няколко задачи с цикли от изпити в СофтУни.

Задача: хистограма

Дадени са n цели числа в интервала [1 … 1000]. От тях някакъв процент p1 са под 200, процент p2 са от 200 до 399, процент p3 са от 400 до 599, процент p4 са от 600 до 799 и останалите p5 процента са от 800 нагоре. Да се напише програма, която изчислява и отпечатва процентите p1, p2, p3, p4 и p5.

Пример: имаме n = 20 числа: 53, 7, 56, 180, 450, 920, 12, 7, 150, 250, 680, 2, 600, 200, 800, 799, 199, 46, 128, 65. Получаваме следното разпределение и визуализация:

Група Числа Брой числа Процент
< 200 53, 7, 56, 180, 12, 7, 150, 2, 199, 46, 128, 65 12 p1 = 12 / 20 * 100 = 60.00%
200 … 399 250, 200 2 p2 = 2 / 20 * 100 = 10.00%
400 … 599 450 1 p3 = 1 / 20 * 100 = 5.00%
600 … 799 680, 600, 799 3 p4 = 3 / 20 * 100 = 15.00%
≥ 800 920, 800 2 p5 = 2 / 20 * 100 = 10.00%

Входни данни

На първия ред от входа стои цялото число n (1 ≤ n ≤ 1000), което представлява броя редове с числа, които ще ни бъдат подадени. На следващите n реда стои по едно цяло число в интервала [1 … 1000] – числата, върху които да бъде изчислена хистограмата.

Изходни данни

Да се отпечата на конзолата хистограма от 5 реда, всеки от които съдържа число между 0% и 100%, форматирано с точност две цифри след десетичния знак (например 25.00%, 66.67%, 57.14%).

Примерен вход и изход

Вход Изход Вход Изход
3
1
2
999
66.67%
0.00%
0.00%
0.00%
33.33%
4
53
7
56
999
75.00%
0.00%
0.00%
0.00%
25.00%
Вход Изход Вход Изход
7
800
801
250
199
399
599
799
14.29%
28.57%
14.29%
14.29%
28.57%
9
367
99
200
799
999
333
555
111
9
33.33%
33.33%
11.11%
11.11%
11.11%
Вход Изход
14
53
7
56
180
450
920
12
7
150
250
680
2
600
200
57.14%
14.29%
7.14%
14.29%
7.14%

Насоки и подсказки

Програмата, която решава този проблем, можем да разделим мислено на три части:

  • Прочитане на входните данни – в настоящата задача това включва прочитането на числото n, последвано от n на брой цели числа, всяко на отделен ред.
  • Обработка на входните данни – в случая това означава разпределяне на числата по групи и изчисляване на процентното разделение по групи.
  • Извеждане на краен резултат – отпечатване на хистограмата на конзолата в посочения формат.

Прочитане на входните данни

Преди да преминем към самото прочитане на входните данни трябва да си декларираме променливите, в които ще ги съхраняваме:

Декларираме си променливи p1_percentage, p2_percentage и т.н., в които ще се пазят процентите, както и cnt_p1, cnt_p2 и т.н., в които ще пазим броя на числата от съответната група.

След като сме си декларирали нужните променливи, можем да пристъпим към прочитането на числото n от конзолата:

Обработка на входните данни

За да прочетем и разпределим всяко число в съответната му група, ще си послужим с for цикъл от 0 до n (броя на числата). Всяка итерация на цикъла ще прочита и разпределя едно единствено число (current_number) в съответната му група. За да определим дали едно число принадлежи към дадена група, правим проверка в съответния ѝ диапазон. Ако това е така - увеличаваме броя на числата в тази група (cnt_p1, cnt_p2 и т.н.) с 1:

След като сме определили колко числа има във всяка група, можем да преминем към изчисляването на процентите, което е и главна цел на задачата. За това ще използваме следната формула:

(процент на група) = (брой числа в група) * 100 / (брой на всички числа)

Няма значение дали ще разделим на 100 (число тип int) или на 100.0 (число тип float), делението ще се извърши и в променливата ще се запази резултата от него. Например: 5 / 2 = 2.5, а 5 / 2.0 = 2.5. В Python 3, няма значение дали ще се дели на цяло число или реално, ако резултата е реално число, то той ще се запише в променливата като число с плаваща запетая. Но, в Python 2.7 е необходимо първо числата да се сведат до тип float, за да получим правилен резултат - реално число. Имайки това предвид, формулата за първата променлива ще изглежда така:

За да стане още по-ясно какво се случва, нека разгледаме следния пример:

Вход Изход
3
1
2
999
66.67%
0.00%
0.00%
0.00%
33.33%

В случая n = 3. За цикъла имаме:

  • i = 0 - прочитаме числото 1, което е по-малко от 200 и попада в първата група, следователно увеличаваме брояча на групата (cnt_p1) с 1.
  • i = 1 – прочитаме числото 2, което отново попада в първата група и увеличаваме брояча ѝ (cnt_p1) отново с 1.
  • i = 2 – прочитаме числото 999, което попада в последната група (p5), защото е по-голямо от 800, и увеличаваме брояча на групата (cnt_p5) с 1.

След прочитането на числата в първата група имаме 2 числа, а в последната - имаме 1 число. В другите групи нямаме числа. Като приложим гореспоменатата формула, изчисляваме процентите на всяка група. Няма значение как ще умножим по 100, или по 100.0 ще получим един и същ резултат: за първата група 66.67%, а за последната група – 33.33% . Но все пак да споменем отново, че това е валидно само за Python 3.

Извеждане на краен резултат

Остава само да отпечатаме получените резултати. В условието е казано, че процентите трябва да са с точност две цифри след десетичната точка. Това ще постигнем, като след placeholder-а изпишем .2f:

Тестване в Judge системата

Тествайте решението си тук: https://judge.softuni.org/Contests/Practice/Index/1054#0.

Задача: умната Лили

Лили вече е на N години. За всеки свой рожден ден тя получава подарък. За нечетните рождени дни (1, 3, 5, …, n) получава играчки, а за всеки четен (2, 4, 6, …, n) получава пари. За втория рожден ден получава 10.00 лв., като сумата се увеличава с 10.00 лв. за всеки следващ четен рожден ден (2 -> 10, 4 -> 20, 6 -> 30 и т.н.). През годините Лили тайно е спестявала парите. Братът на Лили, в годините, които тя получава пари, взима по 1.00 лев от тях. Лили продала играчките, получени през годините, всяка за P лева и добавила сумата към спестените пари. С парите искала да си купи пералня за X лева. Напишете програма, която да пресмята колко пари е събрала и дали ѝ стигат да купи пералня.

Входни данни

От конзолата се прочитат 3 числа, всяко на отделен ред:

  • Възрастта на Лили – цяло число в интервала [1 … 77].
  • Цената на пералнята – число в интервала [1.00 … 10 000.00].
  • Единична цена на играчкацяло число в интервала [0 … 40].

Изходни данни

Да се отпечата на конзолата един ред:

  • Ако парите на Лили са достатъчни:
    • "Yes! {N}" – където N е остатъка пари след покупката
  • Ако парите не са достатъчни:
    • "No! {M}" – където M е сумата, която не достига
  • Числата N и M трябва да са форматирани до втория знак след десетичната точка.

Примерен вход и изход

Вход Изход Коментари
10
170.00
6
Yes! 5.00

Първи рожден ден получава играчка; 2ри -> 10 лв.; 3ти -> играчка; 4ти -> 10 + 10 = 20 лв.; 5ти -> играчка; 6ти -> 20 + 10 = 30 лв.; 7ми -> играчка; 8ми -> 30 + 10 = 40 лв.; 9ти -> играчка; 10ти -> 40 + 10 = 50 лв.
Спестила е -> 10 + 20 + 30 + 40 + 50 = 150 лв.. Продала е 5 играчки по 6 лв. = 30 лв..
Брат ѝ взел 5 пъти по 1 лев = 5 лв. Остават -> 150 + 30 – 5 = 175 лв. 175 >= 170 (цената на пералнята) успяла е да я купи и са ѝ останали 175-170 = 5 лв.

21
1570.98
3
No! 997.98

Спестила е 550 лв.. Продала е 11 играчки по 3 лв. = 33 лв. Брат ѝ взимал 10 години по 1 лев = 10лв. Останали 550 + 33 – 10 = 573 лв.
573 < 1570.98не е успяла да купи пералня. Не ѝ достигат 1570.98–573 = 997.98 лв.

Насоки и подсказки

Решението на тази задача, подобно на предходната, също можем да разделим мислено на три части – прочитане на входните данни, обработката им и извеждане на резултат.

Както вече знаем, в повечето скриптови езици, както и в Python, не се грижим да определяме типа на променливите, които декларираме. Интерпретаторът сам преценява какви да бъдат те. За годините на Лили (age) и единичната цена на играчката (present_price) по условие е дадено, че ще са цели числа. Затова ще използваме вградента функция int() да конвентираме прочетената стрингова стойност в тип цяло число. Когато се използва функция input(), резултатът въведен в конзолата винаги е от тип текст (string), затова ако е необходимо той да бъде конвертиран към друг тип, можем да използваме вградените в Python функции за целта. За цената на пералнята (price_of_washing_machine) знаем, че е дробно число и избираме да използваме тип float. В кода по-долу декларираме и инициализираме (присвояваме стойност) на променливите:

За да решим задачата, ще се нуждаем от няколко помощни променливи – за броя на играчките (number_of_toys), за спестените пари (saved_money) и за парите, получени на всеки рожден ден (money_for_birthday). Като присвояваме на money_for_birthday първоначална стойност 10, тъй като по условие е дадено, че първата сума, която Лили получава, е 10 лв:

С for цикъл преминаваме през всеки рожден ден на Лили. Когато водещата променлива е четно число, това означава, че Лили е получила пари и съответно прибавяме тези пари към общите ѝ спестявания. Едновременно с това изваждаме по 1 лев - парите, които брат ѝ взема. След това увеличаваме стойността на променливата money_for_birthday, т.е. увеличаваме с 10 сумата, която тя ще получи на следващия си рожден ден. Обратно, когато водещата променлива е нечетно число, увеличаваме броя на играчките. Проверката за четност осъществяваме чрез деление с остатък (%) на 2 – когато остатъкът е 0, числото е четно, а при остатък 1 - нечетно:

Към спестяванията на Лили прибавяме и парите от продадените играчки:

Накрая остава да отпечатаме получените резултати, като се съобразим с форматирането, указано в условието, т.е. сумата трябва да е закръглена до две цифри след десетичния знак:

В някои програмни езици съществува конструкция, като условния оператор (?:) (наричан още тернарен оператор), тъй като записът е по-кратък. В Python синтаксисът му е следният: операнд1 if операнд2 else операнд3. Вторият операнд е нашето условие и трябва да е от булев тип (т.е. да връща true/false). Ако операнд2 върне стойност true, то ще се изпълни операнд1, а ако върне falseоперанд3. В нашия случай проверяваме дали събраните пари от Лили стигат за една пералня. Ако те са повече или равни на цената на пералнята, то проверката saved_money >= price_of_washing_machine ще върне true и ще се отпечата "Yes! …", а ако е по-малко – резултатът ще е false и ще се отпечата "No! …". Разбира се, вместо условния оператор, можем да използваме и обикновени if проверки.

Повече за условния оператор: https://book.pythontips.com/en/latest/ternary_operators.html.

Тестване в Judge системата

Тествайте решението си тук: https://judge.softuni.org/Contests/Practice/Index/1054#1.

Задача: завръщане в миналото

Иванчо е на 18 години и получава наследство, което се състои от X сума пари и машина на времето. Той решава да се върне до 1800 година, но не знае дали парите ще са достатъчни, за да живее без да работи. Напишете програма, която пресмята дали Иванчо ще има достатъчно пари, за да не се налага да работи до дадена година включително. Като приемем, че за всяка четна (1800, 1802 и т.н.) година ще харчи 12 000 долара. За всяка нечетна (1801, 1803 и т.н.) ще харчи 12 000 + 50 * [годините, които е навършил през дадената година].

Входни данни

Входът се чете от конзолата и съдържа точно 2 реда:

  • Наследените пари – реално число в интервала [1.00 … 1 000 000.00].
  • Годината, до която трябва да живее (включително) – цяло число в интервала [1801 … 1900].

Изходни данни

Да се отпечата на конзолата 1 ред. Сумата трябва да е форматирана до два знака след десетичния знак:

  • Ако парите са достатъчно:
    • "Yes! He will live a carefree life and will have {N} dollars left." – където N са парите, които ще му останат.
  • Ако парите НЕ са достатъчно:
    • "He will need {М} dollars to survive." – където M е сумата, която НЕ достига.

Примерен вход и изход

Вход Изход Обяснения
50000
1802
Yes! He will live a carefree life and
will have 13050.00 dollars left.

1800 → четна
        → Харчи 12000 долара
        → Остават 50000 – 12000 = 38000
1801 → нечетна
        → Харчи 12000 + 19*50 = 12950 долара
        → Остават 38000 – 12950 = 25050
1802 → четна
        → Харчи 12000 долара
        → Остават 25050 – 12000 = 13050

100000.15
1808
He will need 12399.85 dollars
to survive.

1800 → четна
        → Остават 100000.15 – 12000 = 88000.15
1801 → нечетна
        → Остават 88000.15 – 12950 = 75050.15

1808 → четна → -399.85 - 12000 = -12399.85
12399.85 не достигат

Насоки и подсказки

Методът за решаване на тази задача не е по-различен от тези на предходните, затова започваме деклариране и инициализиране на нужните променливи. В условието е казано, че годините на Иванчо са 18, ето защо при декларацията на променливата years ѝ задаваме начална стойност 18. Другите променливи прочитаме от конзолата:

С помощта на for цикъл ще обходим всички години. Започваме от 1800 – годината, в която Иванчо се връща, и стигаме до годината, до която той трябва да живее. В цикъла проверяваме дали текущата година е четна или нечетна. Проверката за четност осъществяваме чрез деление с остатък (%) на 2. Ако годината е четна, изваждаме от наследството (heritage) 12000, a ако е нечетна, изваждаме от наследството (heritage) 12000 + 50 * (годините на Иванчо):

Накрая остава да отпечатаме резултатите, като за целта правим проверка дали наследството (heritage) му е било достатъчно да живее без да работи или не. Ако наследството (heritage) е положително число, отпечатваме: "Yes! He will live a carefree life and will have {N} dollars left.", а ако е отрицателно число: "He will need {М} dollars to survive.". Не забравяме да форматираме сумата до два знака след десетичната точка.

Hint: Обмислете използването на функцията abs(…) при отпечатване на изхода, когато наследството е недостатъчно.

Тестване в Judge системата

Тествайте решението си тук: https://judge.softuni.org/Contests/Practice/Index/1054#2.

Задача: болница

За даден период от време, всеки ден в болницата пристигат пациенти за преглед. Тя разполага първоначално със 7 лекари. Всеки лекар може да преглежда само по един пациент на ден, но понякога има недостиг на лекари, затова останалите пациенти се изпращат в други болници. Всеки трети ден болницата прави изчисления и ако броят на непрегледаните пациенти е по-голям от броя на прегледаните, се назначава още един лекар. Като назначаването става преди да започне приемът на пациенти за деня.

Напишете програма, която изчислява за дадения период броя на прегледаните и непрегледаните пациенти.

Входни данни

Входът се чете от конзолата и съдържа:

  • На първия ред – периода, за който трябва да направите изчисления. Цяло число в интервала [1 … 1000].
  • На следващите редове (равни на броя на дните) – броя пациенти, които пристигат за преглед за текущия ден. Цяло число в интервала [0 … 10 000].

Изходни данни

Да се отпечатат на конзолата 2 реда:

  • На първия ред: "Treated patients: {брой прегледани пациенти}."
  • На втория ред: "Untreated patients: {брой непрегледани пациенти}."

Примерен вход и изход

Вход Изход Обяснения
4
7
27
9
1
Treated patients: 23.
Untreated patients: 21.

1 ден: 7 прегледани и 0 непрегледани пациента за деня
2 ден: 7 прегледани и 20 непрегледани пациента за деня
3 ден: До момента прегледаните пациенти са общо 14,
а непрегледаните – 20 –> Назначава се нов лекар
–> 8 прегледани и 1 непрегледан пациент за деня
4 ден: 1 прегледан и 0 непрегледани пациента за деня
Общо: 23 прегледани и 21 непрегледани пациенти.

Вход Изход
6
25
25
25
25
25
2
Treated patients: 40.
Untreated patients: 87.
3
7
7
7
Treated patients: 21.
Untreated patients: 0.

Насоки и подсказки

Отново започваме, като декларираме и инициализираме нужните променливи. Периодът, за който трябва да направим изчисленията, прочитаме от конзолата и запазваме в променливата period. Ще се нуждаем и от няколко помощни променливи: броя на излекуваните пациенти (treated_patients), броя на неизлекуваните пациенти (untreated_patients) и броя на докторите (count_of_doctors), който първоначално е 7:

С помощта на for цикъл обхождаме всички дни в дадения период (period). За всеки ден прочитаме от конзолата броя на пациентите (current_patients). Увеличаването на докторите по условие може да стане всеки трети ден, НО само ако броят на непрегледаните пациенти е по-голям от броя на прегледаните. За тази цел проверяваме дали денят е трети – чрез аритметичния оператор за деление с остатък (%): day % 3 == 0.

Например:

  • Ако денят е трети, остатъкът от делението на 3 ще бъде 0 (3 % 3 = 0) и проверката day % 3 == 0 ще върне true.
  • Ако денят е втори, остатъкът от делението на 3 ще бъде 2 (2 % 3 = 2) и проверката ще върне false.
  • Ако денят е четвърти, остатъкът от делението ще бъде 1 (4 % 3 = 1) и проверката отново ще върне false.

Ако проверката day % 3 == 0 върне true, ще се провери дали и броят на неизлекуваните пациенти е по-голям от този на излекуваните: untreated_patients > treated_patients. Ако резултатът отново е true, тогава ще се увеличи броят на лекарите (count_of_doctors).

След това проверяваме броя на пациентите за деня (current_patients) дали е по-голям от броя на докторите (count_of_doctors). Ако броят на пациентите е по-голям:

  • Увеличаваме стойността на променливата treated_patients с броя на докторите (count_of_doctors).
  • Увеличаваме стойността на променливата untreated_patients с броя на останалите пациенти, който изчисляваме, като от всички пациенти извадим броя на докторите (current_patients - count_of_doctors).

Ако броят на пациентите не е по-голям, увеличаваме само променливата treated_patients с броя на пациентите за деня (current_patients):

Накрая трябва само да отпечатаме броя на излекуваните и броя на неизлекуваните пациенти.

Тестване в Judge системата

Тествайте решението си тук: https://judge.softuni.org/Contests/Practice/Index/1054#3.

Задача: деление без остатък

Дадени са n цели числа в интервала [1 … 1000]. От тях някакъв процент p1 се делят без остатък на 2, процент p2 се делят без остатък на 3, процент p3 се делят без остатък на 4. Да се напише програма, която изчислява и отпечатва процентите p1, p2 и p3. Пример: имаме n = 10 числа: 680, 2, 600, 200, 800, 799, 199, 46, 128, 65. Получаваме следното разпределение и визуализация:

Деление без остатък на: Числа Брой Процент
2 680, 2, 600, 200, 800, 46, 128 7 p1 = (7 / 10) * 100 = 70.00%
3 600 1 p2 = (1 / 10) * 100 = 10.00%
4 680, 600, 200, 800, 128 5 p3 = (5 / 10) * 100 = 50.00%

Входни данни

На първия ред от входа стои цялото число n (1 ≤ n ≤ 1000) – брой числа. На следващите n реда стои по едно цяло число в интервала [1 … 1000] – числата, които да бъдат проверени на колко се делят.

Изходни данни

Да се отпечатат на конзолата 3 реда, всеки от които съдържа процент между 0% и 100%, с точност две цифри след десетичния знак, например 25.00%, 66.67%, 57.14%.

  • На първия ред – процентът на числата, които се делят на 2.
  • На втория ред – процентът на числата, които се делят на 3.
  • На третия ред – процентът на числата, които се делят на 4.

Примерен вход и изход

Вход Изход Вход Изход Вход Изход
10
680
2
600
200
800
799
199
46
128
65
70.00%
10.00%
50.00%
3
3
6
9
33.33%
100.00%
0.00%
1
12
100.00%
100.00%
100.00%

Насоки и подсказки

За тази и следващата задача ще трябва сами да напишете програмния код, следвайки дадените напътствия.

Програмата, която решава текущия проблем, е аналогична на тази от задача Хистограма, която разгледахме по-горе. Затова можем да започнем с декларацията на нужните ни променливи. Примерни имена на променливи може да са: n – брой на числата (който трябва да прочетем от конзолата) и divisible_by_2, divisible_by_3, divisible_by_4 – помощни променливи, пазещи броя на числата от съответната група.

За да прочетем и разпределим всяко число в съответната му група, ще трябва да завъртим for цикъл от 0 до n (броя на числата). Всяка итерация на цикъла трябва да прочита и разпределя едно единствено число. Различното тук е, че едно число може да попадне в няколко групи едновременно, затова трябва да направим три отделни if проверки за всяко число – съответно дали се дели на 2, 3 и 4 и да увеличим стойността на променливата, която пази броя на числата в съответната група.

Внимание: if-elif конструкция в този случай няма да ни свърши работа, защото след като намери съвпадение се прекъсва по-нататъшното проверяване на условията.

Накрая трябва да отпечатате получените резултати, като спазвате посочения формат в условието.

Тестване в Judge системата

Тествайте решението си тук: https://judge.softuni.org/Contests/Practice/Index/1054#4.

Задача: логистика

Отговаряте за логистиката на различни товари. В зависимост от теглото на всеки товар е нужно различно превозно средство и струва различна цена на тон:

  • До 3 тонамикробус (200 лева на тон).
  • От над 3 и до 11 тонакамион (175 лева на тон).
  • Над 11 тона – влак (120 лева на тон).

Вашата задача е да изчислите средната цена на тон превозен товар, както и колко процента от товара се превозват с всяко превозно средство.

Входни данни

От конзолата се четат поредица от числа, всяко на отделен ред:

  • Първи ред: брой на товарите за превоз – цяло число в интервала [1 … 1000].
  • На всеки следващ ред се подава тонажът на поредния товарцяло число в интервала [1 … 1000].

Изходни данни

Да се отпечатат на конзолата 4 реда, както следва:

  • Ред #1средната цена на тон превозен товар (закръглена до втория знак след десетичната точка).
  • Ред #2процентът товар, превозван с микробус (между 0.00% и 100.00%, закръглен до втория знак след десетичната точка).
  • Ред #3процентът товар, превозвани с камион (между 0.00% и 100.00%).
  • Ред #4процентът товар, превозвани с влак (между 0.00% и 100.00%).

Примерен вход и изход

Вход Изход Обяснения
4
1
5
16
3
143.80
16.00%
20.00%
64.00%
С микробус се превозват два от товарите 1 + 3, общо 4 тона.
С камион се превозва един от товарите: 5 тона.
С влак се превозва един от товарите: 16 тона.
Сумата от всички товари е: 1 + 5 + 16 + 3 = 25 тона.
Процент товар с микробус: 4/25*100 = 16.00%
Процент товар с камион: 5/25*100 = 20.00%
Процент товар с влак: 16/25*100 = 64.00%
Средна цена на тон превозен товар: (4 * 200 + 5 * 175 + 16 * 120) / 25 = 143.80
Вход Изход Вход Изход
5
2
10
20
1
7
149.38
7.50%
42.50%
50.00%
4
53
7
56
999
120.35
0.00%
0.63%
99.37%

Насоки и подсказки

Първо ще прочетем теглото на всеки товар и ще сумираме колко тона се превозват съответно с микробус, камион и влак и ще изчислим и общите тонове превозени товари. Ще пресметнем цените за всеки вид транспорт според превозените тонове и общата цена. Накрая ще пресметнем и отпечатаме общата средна цена на тон и каква част от товара е превозена с всеки вид транспорт процентно.

Декларираме си нужните променливи, например: count_of_loads – броя на товарите за превоз (прочитаме ги от конзолата), sum_of_tons – сумата от тонажа на всички товари, microbus_tons, truck_tons, train_tons – променливи, пазещи сумата от тонажа на товарите, превозвани съответно с микробус, камион и влак.

Ще ни трябва for цикъл от 0 до count_of_loads - 1, за да обходим всички товари. За всеки товар прочитаме теглото му (в тонове) от конзолата и го запазваме в променлива, например tons. Прибавяме към сумата от тонажа на всички товари (sum_of_tons) теглото на текущия товар (tons). След като сме прочели теглото на текущия товар, трябва да определим кое превозно средство ще се ползва за него (микробус, камион или влак). За целта ще ни трябват if-elif проверки:

  • Ако стойността на променливата tons е по-малка от 3, увеличаваме стойността на променливата microbus_tons със стойността на tons:

    microbus_tons += tons;
  • Иначе, ако стойността tons е до 11, увеличаваме truck_tons с tons.

  • Ако tons e повече от 11, увеличаваме train_tons с tons.

Преди да отпечатаме изхода трябва да изчислим процента на тоновете, превозвани с всяко превозно средство и средната цена на тон. За средната цена на тон ще си декларираме още една помощна променлива total_price, в която ще сумираме общата цена на всички превозвани товари (с микробус, камион и влак). Средната цена ще получим, разделяйки total_price на sum_of_tons. Остава сами да изчислите процента на тоновете, превозвани с всяко превозно средство, и да отпечатате резултатите, спазвайки формата в условието.

Тестване в Judge системата

Тествайте решението си тук: https://judge.softuni.org/Contests/Practice/Index/1054#5.