|
Вопрос # 3 316/ вопрос открыт / |
|
Здравствуйте, эксперты!
Одна баночка кока-колы стоит B рублей. Пустую баночку из-под кока-колы можно сдать и получить за неё E рублей.
У Васи есть R рублей. Он покупает кока-колу, выпивает её, сдаёт баночку, снова покупает кока-колу и так далее до тех пор,
пока имеющихся у него денег (после сдачи очередной баночки) хватает на покупку кока-колы. Сколько банок кока-колы
он выпьет?
Примеры ввода: 2 1 3 Вывод: 2
3 1 13 Вывод: 6
2 1 1 Вывод: 0
 |
Вопрос задал: Arti (статус: Посетитель)
Вопрос отправлен: 22 октября 2009, 15:10
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Arti!
пусть есть денег R. тогда он может купить
m := R div B банок. у него останеться n := R mod B рублей.
когда он сдаст эти банки, у него будет денег
R := m * E + n;
если R больше B (то есть у него ещё есть деньги), то повторяем всю цепочку заново.
Осталось только добавить счетчик банок и решение готово.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 октября 2009, 15:18
|
Ответ #2. Отвечает эксперт: min@y™
Вот тибе функция расчёта
function GetCanCount(B, E, R: Cardinal): Cardinal;
begin
Result:= 0;
if B <= E
then Exit; // некоррекнтые данные
while (R >= B) do
begin
Inc(Result);
R:= R - B + E;
end;
end;
Программа под катом.
Приложение: Переключить в обычный режим- program p3316;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils;
-
- function GetCanCount(B, E, R: Cardinal): Cardinal;
- begin
- Result:= 0;
-
- if B <= E
-
-
- while (R >= B) do
- begin
- Inc(Result);
- R:= R - B + E;
- end;
- end;
-
- var
- B, E, R: Cardinal;
-
- begin
- Write(' Enter the B, E and R values: ');
- ReadLn(B, E, R);
-
- WriteLn(' Can count: ', GetCanCount(B, E, R));
-
- ReadLn;
- end.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 октября 2009, 15:44
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 22 октября 2009, 15:57; участников в обсуждении: 2.
|
Arti (статус: Посетитель), 22 октября 2009, 15:19 [#1]:
Спасибо, уже решил.
Достаточно в цикле вычесть из суммарных его денег стоимость одной баночки (рыночную), прибавить цену баночки, как он её продал, и увеличивать счётчик банок на +1.
В цикле условие сумма денег >= рын. цена одной банки.
Спасибо!
|
|
Вадим К (статус: Академик), 22 октября 2009, 15:37 [#2]:
решение хорошее, но далеко не оптимальное. Если денег припустим миллион, то долго будет вычитать. А на олимпиадных задачах обычно ставиться лимит по времени.
p.s. здесь "спасибо" балами ставят
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Arti (статус: Посетитель), 22 октября 2009, 15:44 [#3]:
Ок, без проблем. Как смогу - поставлю.
Ваше решение попробовал, но оно выдаёт некорректные выходные данные.
Как при целом R, так и при дробном.
|
|
Вадим К (статус: Академик), 22 октября 2009, 15:57 [#4]:
ну наверно стоит выводить в копейках сумму и всё будет хорошо. Ведь дробных копеек в обычных расчетах быть не может. Хотя может просто неаккуратно реализовали алгоритм.
Галочка "подтверждения прочтения" - вселенское зло.
|
22 октября 2009, 18:11: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|