Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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, 20:02   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,005
Репутация: 6348
По умолчанию

Код:

sum:=(n div 100)*100+((m mod 100) div 20)*30+(n mod 20)*2;

__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 30.01.2017, 01:06   #3
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
Репутация: 75
По умолчанию

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

icq: 438888048
По умолчанию

Тестировал в дельфи, так что есть неподходящие операторы. Наверное, можно и покрасивее решить. Идея в том, что можно взять лишнюю упаковку, чтобы необходимое количество дисков вышло дешевле.
Код:

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 в 06:54.
BDA вне форума   Ответить с цитированием
Старый 30.01.2017, 11:42   #5
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,517
Репутация: 5308
По умолчанию

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

Цитата:
можно взять лишнюю упаковку
Хорошая мысля приходит опосля )) Тогда так
Код:

  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, 12:13   #7
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,517
Репутация: 5308
По умолчанию

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

Действительно, дело в этом
Спасибо большое
dimon_snake вне форума   Ответить с цитированием
Старый 30.01.2017, 20:42   #9
BDA
Модератор
Заслуженный модератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Адрес: RF Moscow
Сообщений: 5,383
Репутация: 2468

icq: 438888048
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
там ошибочка в логике есть
Ага, забыл хвост отбрасывать при замене.
Код:

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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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 23:43


10:25.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru