Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 316

/ вопрос открыт /

Здравствуйте, эксперты!
Одна баночка кока-колы стоит B рублей. Пустую баночку из-под кока-колы можно сдать и получить за неё E рублей.
У Васи есть R рублей. Он покупает кока-колу, выпивает её, сдаёт баночку, снова покупает кока-колу и так далее до тех пор,
пока имеющихся у него денег (после сдачи очередной баночки) хватает на покупку кока-колы. Сколько банок кока-колы
он выпьет?

Примеры ввода: 2 1 3 Вывод: 2
3 1 13 Вывод: 6
2 1 1 Вывод: 0

Arti Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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;

Программа под катом.

Приложение:
  1. program p3316;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8. function GetCanCount(B, E, R: Cardinal): Cardinal;
  9. begin
  10. Result:= 0;
  11.  
  12. if B <= E
  13.  
  14.  
  15. while (R >= B) do
  16. begin
  17. Inc(Result);
  18. R:= R - B + E;
  19. end;
  20. end;
  21.  
  22. var
  23. B, E, R: Cardinal;
  24.  
  25. begin
  26. Write(' Enter the B, E and R values: ');
  27. ReadLn(B, E, R);
  28.  
  29. WriteLn(' Can count: ', GetCanCount(B, E, R));
  30.  
  31. ReadLn;
  32. end.


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 октября 2009, 15:44


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 22 октября 2009, 15:57; участников в обсуждении: 2.
Arti

Arti (статус: Посетитель), 22 октября 2009, 15:19 [#1]:

Спасибо, уже решил.
Достаточно в цикле вычесть из суммарных его денег стоимость одной баночки (рыночную), прибавить цену баночки, как он её продал, и увеличивать счётчик банок на +1.
В цикле условие сумма денег >= рын. цена одной банки.
Спасибо!
Вадим К

Вадим К (статус: Академик), 22 октября 2009, 15:37 [#2]:

решение хорошее, но далеко не оптимальное. Если денег припустим миллион, то долго будет вычитать. А на олимпиадных задачах обычно ставиться лимит по времени.

p.s. здесь "спасибо" балами ставят:)
Галочка "подтверждения прочтения" - вселенское зло.
Arti

Arti (статус: Посетитель), 22 октября 2009, 15:44 [#3]:

Ок, без проблем. Как смогу - поставлю.

Ваше решение попробовал, но оно выдаёт некорректные выходные данные.

Как при целом R, так и при дробном.
Вадим К

Вадим К (статус: Академик), 22 октября 2009, 15:57 [#4]:

ну наверно стоит выводить в копейках сумму и всё будет хорошо. Ведь дробных копеек в обычных расчетах быть не может. Хотя может просто неаккуратно реализовали алгоритм.
Галочка "подтверждения прочтения" - вселенское зло.

22 октября 2009, 18:11: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.