Помощь - Поиск - Пользователи - Календарь
Полная версия: Смарт карточка (
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Cheburashka
Мальчик Вася каждый день ездит на метро. Утром он едет в школу, а вечером того же дня, обратно из школы, домой. Для того, чтобы немного сэкономить, он покупает электронную смарт-карту на X поездок. Когда он хочет зайти в метро, он прикладывает карту к турникету. Если на карте осталось ненулевое количество поездок, то турникет пропускает Васю и списывает с карты одну поездку. Если же на карте не осталось поездок, то турникет не пропускает Васю, и он (Вася) вынужден купить на этой же станции новую карту на X поездок и вновь пройти через турникет.

Вася заметил, что в связи с тем, что утром метро переполнено, покупать новую карту утром накладно по времени, и он может опоздать в школу. В связи с этим он хочет понять: будет ли такой день, что с утра, поехав в школу, окажется, что у него на карточке ноль поездок.

Вася больше никуда на метро не ездит и поэтому заходит в метро только на станции около дома и на станции около школы.

Входные данные
Во входном файле INPUT.TXT содержится ровно 2 строки. В первой содержится слово «School» или «Home» в зависимости от того, где первый раз Вася купил карточку на X поездок. Во второй строке содержится натуральное число X, 1 ≤ X ≤ 1000.

Выходные данные
В выходной файл OUTPUT.TXT следует вывести «Yes», если будет такой день, что утром у Васи на карточке окажется ноль поездок и «No» в противном случае.

Вот такая вот задачка)) Можете разъяснить как её решить?
Lapp
Цитата(Сергей Меркурьев @ 10.05.2009 8:22) *
Можете разъяснить как её решить?
Можем.
Но сначала скажи, в чем у тебя затруднение.

Задача - проще некуда. Но есть одна проблема, которая, возможно, тебя смущает.. Я попробую высказать свою догадку, и если это тебе поможет - хорошо, если нет - спрашивай дальше.
Вот тут есть условие задачи (откуда ты, видимо, ее и взял) с примерами входных и выходных данных. Так вот, проблема, как мне кажется, касается примеров выходных данных..
Постарайся понять, что есть два совершенно разных свойства: формат данных и значение данных. В приведенной задаче выходной файл должен иметь определенный формат - он должен содержать одно из слов: "Yes" или "No". Если выходной файл будет содержать слово "Elephant" или число 123 - это значит, что формат неверный. Если же файл содержит "Yes", в то время как правильный ответ задачи "No" - это значит, что формат файла все равно верен, хотя задача решена неверно. Так вот, в примерах выходных данных приведены правильные форматы, в то время как правильность ответа не гарантирована. Это может несколько сбивать с толку, но совершенно нормально, поскольку примеры демонстрируют только формат данных.

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


amega
Сергей Меркурьев
а эт случайно не олимпиадная задачка?

а ну да посмотрел на посту выше ссылку (просто сначала ее не заметил)
Lapp
Цитата(amega @ 10.05.2009 9:46) *
а эт случайно не олимпиадная задачка?

amega, трудно пройти по ссылке, которую я привел?
amega
Lapp

я увидел когда перечитывал сообщение
Цитата
Вот тут есть

прото слова тут очень маленькое и я его не сразу увидел
blush.gif
Cheburashka
Amega в принципе да.
Lapp ну про форматный вывод данных я в принципе знаю, а вот как нужно точно проверять мне не понятно(((

Я проверял наверное глупым способом... и он не проходит потестам...
program N_22;
var X:longint;
S:string;
Begin
assign (input,'input.txt');
reset (input);
assign (output,'output.txt');
rewrite (output);
Readln (S);
Read (X);
If S='Home' then If X mod 2=0 then write ('No')
else If X=1 then Write('Yes')
else Write('No')
else If X mod 2=0 then write ('No')
else If X=1 then Write('No')
else Write('Yes')


End.
Lapp
Цитата(Сергей Меркурьев @ 10.05.2009 15:22) *
как нужно точно проверять мне не понятно(((
Проверяй четность числа Х, предварительно увеличив его на 1, если во входном файле содержится School.
if S='School' then Inc(x);
if Odd(X) then Write('No') else Write('Yes');
Cheburashka
Что выполняет фунция odd?

Добавлено через 7 мин.
Ладно про odd я нашёл)) А вот я всё равно не понимаю зачем вы таким образом проверяете? И данную проверку нужно проводить с каждым пунктом (дом или школа)?
Lapp
Цитата(Сергей Меркурьев @ 10.05.2009 20:14) *
не понимаю зачем вы таким образом проверяете? И данную проверку нужно проводить с каждым пунктом (дом или школа)?
Нет, не нужно. Это все решение задачи (плюс чтение входных данных).

Ну смотри. Если бы он покупал только дома, то все зависело бы только от четности числа поездок Х. Но он мог купить и в школе. Если он купил в школе, то в тот момент, когда он приехал домой, ситуация неотличима от той, что он как бы купил ДОМА, но НА ОДНУ ПОЕЗДКУ МЕНЬШЕ (эту поездку он потратил на путь домой). Значит, он как бы купил дома карту на Х-1 поездок, причем дома. Вычитание единицы приводит к смене четности - вот и все. Я в своем решении заменил вычитание единицы на прибавление, что для четности абсолютно то же самое (а поскольку числа не превосходят 1000, то с диапазонами тоже все Ок).

Теперь понятнее? Спрашивай, если нет.
Cheburashka
В принципе понятно но у меня она с таким решением не проходит((
Я её чуть-чуть по другому сделал у меня она застрявает на 10 тесте((

program N_22;
var X:longint;
S:string;
Begin
assign (input,'input.txt');
reset (input);
assign (output,'output.txt');
rewrite (output);
Readln (S);
Read (X);
if S='School' then Inc(x);
If X=1 then Write ('Yes')
else if Odd(X) then Write('No') else Write('Yes')
End.
Lapp
Цитата(Сергей Меркурьев @ 11.05.2009 12:20) *
она застрявает на 10 тесте
К сожалению, условие задачи сформулировано не лучшим образом, что порождает неверное толкование.. Дело в том, что надо понимать так, что Вася продолжает покупать карточки с тем же самым количеством поездок. И в этом случае, если Х нечетно, то ему, бедняге, гарантировано придется (хотя и через раз) покупать карту утром. Если же Х четно, то все зависит от того, где была куплена первая карта - если в школе, то ему повезло, если дома - я ему не завидую..))

Таким образом, верное решение таково:
  if Odd(x) or (s='Home') then Write(f,'Yes') else Write(f,'No');

Вот так.
Извиняюсь, что сначала повелся на на эту неточность формулировки..
Cheburashka
Даже с вашим решением как то не очень она хочет идти(((

Добавлено через 7 мин.
Всё спасибо)) Разобрался))
Очень хорошая функция Odd (x), если бы Вы её мне не подсказали то проверял бы я значения на чётность и нечётность следующим образом:
(x mod 2=0) иль же так (x mod 2=1);

Спасибо Вам за помощь)) Думаю, что в скором времени, что нибудь смогу найти новое)))
Lapp
Цитата(Сергей Меркурьев @ 12.05.2009 19:00) *
проверял бы я значения на чётность и нечётность следующим образом:
(x mod 2=0) иль же так (x mod 2=1);
Если честно, ничего плохого в этом не вижу)).
Тебе спасибо за задачу. Полезно иногда пропесочить мозги, чтоб не расслаблялись до такого безобразия.. smile.gif
Cheburashka
Ну в принципе да)) Можно и тем, и тем способом)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.