Форум по Delphi программированию

 



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.11.2011, 18:22
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию олимпиадная задачка

перед предстоящей олимпиадой решил попробовать себя в тестовой задачке
сама тестовая задачка
Цитата:
Когда столбик термометра каждый день замирает на отметке около +40, очень хорошо продается вода — газированная, минеральная, лимонады... Настолько хорошо, что покупатели обращают внимание на марку воды и производителя куда меньше, чем обычно. Директор торговой сети «Альнико» для лучшего планирования пополнения запасов потребовал, чтобы каждое утро у него на столе лежал отчет о том, сколько было продано воды за предыдущий день. На следующее утро желаемая цифирь была ему предоставлена.

— 3236,6 л. воды газированной, 2671,25 л. лимонадов, — начал читать он и возмутился, — Да, когда мы будем заказывать поставку, так и попросим, чтобы не забыли бутылочку 0,6 литра положить. Мне нужны круглые цифры: 3 тысячи литров воды газированной, 2 тысячи литров лимонада. Понятно?

Сотрудникам было понятно, и на следующий день директор был доволен: снова 3 тысячи литров газировки и 2 тысячи литров лимонада. А еще через день директору принесли общий отчет о продажах. И он снова был рассержен:

— Я сам посчитал: за четыре дня продано 12 тысяч литров газированной воды. А в общем отчете больше 14!

— Так Вы же сами просили сообщать только количество тысяч литров... А было: 3236,6 л., потом 3749,2 л., потом 3874,8 л., и, наконец, 3521,6 л. Так что вот и получилось 14382,2 л.

Нельзя сказать, чтобы директора успокоила такая арифметика:

— Ну, тогда округляйте! Эти 3200 с чем там — до 3 тысяч, а 3800 — до 4 тысяч.

— Так ведь все равно не сойдется, — возразил один из менеджеров. — Получится 3 + 4 + 4 + 4, итого 15. А 14382 все же к 14 ближе...

— Так, я хочу, чтобы все было нор-маль-но! Цифры должны сходиться. Каждый день. А как вы это сделаете, не важно!

— Хорошая задачка, — сказал один менеджер другому, когда они вышли из кабинета директора. — Значит, надо то округлять, то отбрасывать. И каждый день результат должен быть как можно больше похож на реальный.

— Ну да, — поддержал его другой. — Получается, во второй и третий дни надо было округлять до 4, а вот в четвертый уже отбросить. Давай программиста попросим, ему работы на пять минут, а нам какое облегчение...

Ваша задача — по заданной последовательности объемов продаж каждый день составить инструкцию для менеджеров. Для простоты менеджеры отбросили дробные части литра и сообщают Вам только целые числа. Инструкция должна помочь им выбрать между уменьшением и увеличением объема продаж при записи его в тысячах литров, так чтобы каждый день данные директора наилучшим образом (т.е. с точностью до обычного математического округления) совпадали с общим отчетом.



Формат входного файла input.txt

Первая строка — целое число N (1 <= N <= 100) — количество дней, в течение которых фиксируются объемы продаж.

Каждая из следующих N строк содержит одно целое число (не меньшее 1000 и не большее 10000) — объем продаж в соответствующий день



Формат выходного файла output.txt

Первая строка — строка из N символов (без пробелов), содержащая символ F, если при учете объема продаж в этот день нужно уменьшить число (или же нет необходимости его изменять), и символ C, если нужно его увеличить.



Пример входного файла — 1

4

3237

3749

3875

3522



Пример выходного файла — 1

FCCF



Пояснение к примеру:

1-ый день: директор получает отчет о продаже 3 тысяч литров, в общем отчете — 3237 литров, или 3,237 тысяч литров. Математическое округление даст 3.

2-ой день: директор получает отчет о продаже 4 тысяч литров, в общем отчете — 6,986 тысяч литров. Суммарно у директора получается 7 тысяч литров.

3-ий день: директор получает отчет о продаже 4 тысяч литров, суммарно у него получается 11 тысяч литров, а в общем отчете — 10,861 тысяч литров

4-ый день: директор получает отчет о продаже 3 тысяч литров, суммарно у него выходит 14 тысяч литров, а в общем отчете — 14,383 тысячи литров.



Пример входного файла — 2



5

3300

3285

4000

3175

3775



Пример выходного файла — 2

FCFFC

вот что я написал
Код:
program ConPrg;
{$APPTYPE CONSOLE}

var
fin, fout: TextFile;
result: string;
n1,n2,k,z: real;
i: integer;
m: array[1..101] of integer;
begin

AssignFile(fin, 'input.txt');
Reset(fin);
for i:=1 to 101 do
Readln(fin, m[i]);

k:=0;
n2:=0;
for i:=1 to m[1] do
 begin
  z:=m[i+1]/1000;
  k:=k+z;
  n1:=n2;
  n2:=Round(k);
  if (n2-n1)>z then result:=result+'C'
  else if ((n2-n1)<z) or ((n2-n1)=z) then result:=result+'F';
 end;

CloseFile(fin);
AssignFile(fout, 'output.txt');
Rewrite(fout);
write(fout, result);
CloseFile(fout);
end.

закинул на проверку и выдало
Цитата:
Wrong Answer on test 6 - решение выдало неверный результат на тесте 6. Проверьте правильность придуманного Вами алгоритма.
вроде все правильно, если не трудно подскажите что может быть не так

Последний раз редактировалось ALexandr555, 30.11.2011 в 19:05.
Ответить с цитированием
  #2  
Старый 30.11.2011, 22:08
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

я предположил что проблема в round(k)
т.к.
Цитата:
Округление использует банковские правила, где точная половина значения вызывает округление к четному числу
и заменил её вот так
Код:
if Frac(k)>0.5 then n2:=k+1-Frac(k)
  else if (Frac(k)<0.5) or (Frac(k)=0.5) then n2:=k-Frac(k);
но так ошибка встречается еще раньше, в каком то "4" тесте программы =(
Ответить с цитированием
  #3  
Старый 30.11.2011, 22:28
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

округление так надо

Код:
  if (Frac(k)>0.5) or (Frac(k)=0.5) then n2:=k+1-Frac(k)
  else if (Frac(k)<0.5)  then n2:=k-Frac(k);
и все правильно
Ответить с цитированием
  #4  
Старый 30.11.2011, 22:31
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот это что:
Код:
  ... 
  n2 := 0;
  for i := 1 to m[1] do
  begin
  ...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #5  
Старый 30.11.2011, 23:26
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Первая строка — целое число N (1 <= N <= 100) — количество дней, в течение которых фиксируются объемы продаж.
да уже все работает
Ответить с цитированием
  #6  
Старый 30.11.2011, 23:44
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от ALexandr555
да уже все работает
Как скажешь.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 01.12.2011, 00:09
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

я ж написал в чем проблема была, round кривой какой то) пришлось свое округление
Ответить с цитированием
Ответ



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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2020

ВКонтакте   Facebook   Twitter