Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2017, 18:28   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Покупка дисков

100 дисков стоит сто рублей, 20 дисков - 30 рублей, 1 диск - 2 рубля
Какое минимально кол-во денег можно потратить на покупку n дисков?
n<=1000
Что-то я не учёл, помогите пожалуйста найти, что именно
Код:
var
n,sum,k:integer;
begin
  read(n);
  sum:=((n div 100)*100);
  n:=n mod 100; 
  if n=0 then
  begin
    write(sum);
    exit;
  end;
  k:=n div 20;
  sum:=sum + (k * 30);
  n:= n -  (k * 20);
  if n=0 then 
  begin
    write(sum);
    exit;
  end;
  sum:=sum + (n*2);
  write(sum);
end.
dimon_snake вне форума Ответить с цитированием
Старый 29.01.2017, 19:02   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
sum:=(n div 100)*100+((m mod 100) div 20)*30+(n mod 20)*2;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.01.2017, 00:06   #3
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
sum:=(n div 100)*100+((m mod 100) div 20)*30+(n mod 20)*2;
Не катит
Делает те же тесты, что и у меня
dimon_snake вне форума Ответить с цитированием
Старый 30.01.2017, 01:23   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Тестировал в дельфи, так что есть неподходящие операторы. Наверное, можно и покрасивее решить. Идея в том, что можно взять лишнюю упаковку, чтобы необходимое количество дисков вышло дешевле.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  last = 2;
  count: array [0 .. last] of integer = (100, 20, 1);
  cost: array [0 .. last] of integer = (100, 30, 2);
var
  n, i, tmp, sum: integer;
  counts: array [0 .. last] of integer;
begin
  n := strtointdef(Edit1.text, 0);
  tmp := n;
  for i := 0 to last do
  begin
    counts[i] := tmp div count[i];
    tmp := tmp mod count[i];
  end;
  if tmp > 0 then
    inc(counts[last]);
  sum := counts[0] * cost[0];
  for i := last - 1 downto 0 do
  begin
    tmp := counts[i + 1] * cost[i + 1];
    if tmp > cost[i] then
      sum := sum + cost[i]
    else
      sum := sum + tmp;
  end;
  showmessage(inttostr(sum));
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 30.01.2017 в 05:54.
BDA вне форума Ответить с цитированием
Старый 30.01.2017, 10:42   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от dimon_snake Посмотреть сообщение
Что-то я не учёл,
как правильно заметил BDA, Вы не учитываете, что в некоторых ситуациях купить дисков больше, чем n, выйдет дешевле, чем купить ровно n дисков.
ну, например, подсчитайте, сколько нужно денег, чтобы купить 96 дисков?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.01.2017, 10:52   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
можно взять лишнюю упаковку
Хорошая мысля приходит опосля )) Тогда так
Код:
  j1:=n div 100;
  j2:=(n mod 100) div 20;
  j3:=n mod 20;
  sum:=Min(j1*100+j2*30+j3*2,Min(j1*100+(j2+1)*30,(j1+1)*100));
Это короче и точней чем у BDA, там ошибочка в логике есть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.01.2017, 11:13   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Хорошая мысля приходит опосля )) Тогда так
Высший класс, коротко, наглядно, надёжно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.01.2017, 18:19   #8
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Действительно, дело в этом
Спасибо большое
dimon_snake вне форума Ответить с цитированием
Старый 30.01.2017, 19:42   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
там ошибочка в логике есть
Ага, забыл хвост отбрасывать при замене.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  last = 2;
  count: array [0 .. last] of integer = (100, 20, 1);
  cost: array [0 .. last] of integer = (100, 30, 2);
var
  n, i, tmp, sum: integer;
  counts: array [0 .. last] of integer;
begin
  n := strtointdef(Edit1.text, 0);
  tmp := n;
  for i := 0 to last do
  begin
    counts[i] := tmp div count[i];
    tmp := tmp mod count[i];
  end;
  if tmp > 0 then
    inc(counts[last]);
  sum := 0;
  for i := last - 1 downto 0 do
  begin
    tmp := counts[i + 1] * cost[i + 1] + sum;
    if tmp > cost[i] then
      sum := cost[i]
    else
      sum := tmp;
  end;
  sum := sum + counts[0] * cost[0];
  showmessage(inttostr(sum));
end;
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Высший класс, коротко, наглядно, надёжно.
Полностью согласен.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Steam [Покупка] Rakim4ik Общие вопросы Delphi 1 16.09.2014 15:33
покупка дельфи Wisemanykt Свободное общение 5 24.07.2013 12:41
Покупка нетбука dodomenos Свободное общение 1 31.03.2011 15:57
Покупка ноутбука. Coco_Jamboo Компьютерное железо 6 29.01.2011 22:43