История
Версия для печати

Архив форума

penartur 15.04.2004 19:41
Кто-нибудь знает, что был за первый тест в задаче Е (лифт)?
У нас уже где-то на 150 минуте была готова программа, но она всё время валилась (WA) на нём, хотя, как позже (на разборе) выяснилось, она была совершенно правильной...
Опытным путём вставления в разные места бесконечных циклов установлено, что, если не считать ведущих нулей и пробелов (не знаю, были ли они):
1) Число на входе 3- или более-значное
2) Первые две цифры образуют число, строго меньшее 20
3) Но это не 10,11,12,13,15,18 или 19
Станислав Васильев 15.04.2004 20:06
Тест был 7, правильный ответ 4 а не 3, как у некоторых :)
penartur 15.04.2004 20:07
У нас ответ 4...
У нас в задаче даже цифры 3 вроде нет...
Если интересно, могу завтра послать сюда исходник (распечатка сейчас у Андрея).
penartur 16.04.2004 19:26
В общем, наша команда - вторая, которая (по крайней мере, идейно) решила задачу E2.
Мы валились на 1 тесте, потому что он содержал цифру 7 и два символа - перевод строки.
Кому интересно: код программы
program TaskE;

{$APPTYPE CONSOLE}
var c1,c2:char;
len,n,i:longint;

function getint(tmpstr:string):longint;
var tmpa,tmpb:longint;
begin
val(tmpstr,tmpa,tmpb);
getint:=tmpa;
end;

begin
{ TODO -oUser -cConcole Main : Insert code here }
assign(input,'input.txt');
reset(input);
assign(output,'output.txt');
rewrite(output);
//////////////////////////
read(c1);
if(eof(input)) then begin
len:=1;
n:=getint(c1);
end else begin
read(c2);
n:=getint(c1+c2);
len:=2;
while(not eof(input)) do begin
read(c1);
len:=len+1;
end;
end;
// writeln('n=',n);
// writeln('len=',len);
if(len=1) then begin
write(4);
end;
if(len=2) then begin
if(n<12) then begin
write(8);
end else if(n<20) then begin
write(6);
end else if(n<40) then begin
write(11);
end else begin
write(31);
end;
end;
if(len>2) then begin
if(n<12) then begin
write(7);
end else if(n<20) then begin
write(5);
end else if(n<40) then begin
write(1);
end else begin
write(3);
end;
i:=3;
if(n<20) then begin
i:=4;
end;
while(i<=len) do begin
write('0');
i:=i+1;
end;
write(1);
end;
//////////////////////////
close(output);
close(input);
end.
А почему жюри так несправедливо поступает? В тексте задачи ведь сказано, что "входной файл содержит целое число N", а в тесте ещё какие-то служебные символы... Мы подали на аппеляцию, но нам отказали - сказали. что нигде не написано, что этих лишних символов нет...
Исправленный вариант программы:
program Task2e;

{$APPTYPE CONSOLE}
var c1,c2:char;
len,n,i:longint;
tmpstr:string;

function getint(tmpstr:string):longint;
var tmpa,tmpb:longint;
begin
val(tmpstr,tmpa,tmpb);
getint:=tmpa;
end;

begin
{ TODO -oUser -cConcole Main : Insert code here }
assign(input,'input.txt');
reset(input);
assign(output,'output.txt');
rewrite(output);
//////////////////////////
read(tmpstr);
len:=length(tmpstr);
if(len>2) then begin
tmpstr:=copy(tmpstr,1,2);
end;
n:=getint(tmpstr);
// writeln('n=',n);
// writeln('len=',len);
if(len=1) then begin
write(4);
end;
if(len=2) then begin
if(n<12) then begin
write(8);
end else if(n<20) then begin
write(6);
end else if(n<40) then begin
write(11);
end else begin
write(31);
end;
end;
if(len>2) then begin
if(n<12) then begin
write(7);
end else if(n<20) then begin
write(5);
end else if(n<40) then begin
write(1);
end else begin
write(3);
end;
i:=3;
if(n<20) then begin
i:=4;
end;
while(i<=len) do begin
write('0');
i:=i+1;
end;
write(1);
end;
//////////////////////////
close(output);
close(input);
end.
Den Raskovalov 16.04.2004 19:37
penartur:
В общем, наша команда - вторая, которая (по крайней мере, идейно) решила задачу E2.
Мы валились на 1 тесте, потому что он содержал цифру 7 и два символа - перевод строки.
Лично я взял за правило писать столь надежный ввод данных, насколько позволяют условия задачи. В этой задаче это совсем просто ;) К тому же у вашего решения просто не было шансов, т.к. вы работаете с longint'ами. Зачем сабмитить решение, которое заведомо не зайдет?
Александр Мироненко 16.04.2004 19:46
Да нет же, они в лонгинт пихают максимум первые два символа входа. Другое дело, что они не обрабатывают коды возврата функции val.
В любом случае конечно лучше перестраховаться, и опытные команды делают это на автопилоте - проверяют конец файла, даже если в условии сказано, что в конце есть -1 и т.п.
penartur 16.04.2004 19:47
Почему?
longint - это только привычка... У нас хранится только
1) Первые две цифры
2) Длина числа со входа
3) Счётчик, который пробегает значения от 3(4) до длины числа.
Первая переменная находится в диапазоне от 0 до 99, вторая - от 1 до 1001, третья - от 3 до 1001. И тут что-то не лезет в лонгинт?
penartur 16.04.2004 19:50
Ну я бы не сказал, что мы опытная команда... по сравнению с третье- и четверокурсуниками, которые тут участвовали... 4 задачи - это, наверное, тоже неплохо, но хотелось бы 5... или даже 6... (в первый день я за пять минут до конца отрыл глюк в своей рекурсиив задаче И, за 3 минуты до конца он уже был исправлен, но я не успел убрать свой вывод всякой фигни в файл :-()
Den Raskovalov 16.04.2004 19:53
penartur:
Ну я бы не сказал, что мы опытная команда... по сравнению с третье- и четверокурсуниками, которые тут участвовали... 4 задачи - это, наверное, тоже неплохо, но хотелось бы 5... или даже 6... (в первый день я за пять минут до конца отрыл глюк в своей рекурсиив задаче И, за 3 минуты до конца он уже был исправлен, но я не успел убрать свой вывод всякой фигни в файл :-()
Привыкай. На этом ЧУ мне 10 минут не хватило, чтобы Архиватор сдать ;) А как было бы эффектно :lol: Дома где-то за это время довел ;) Во втором туре прохлопал сравнительно простую задачу H. Виню в этом усталость...
Илья Гофман 16.04.2004 19:59
надо было читать ЛВ. :)) за 3 дня перед соревнованиями - никаких задач! и тем более в промежутке между турами! а ты стал решать вечером после тура, наверняка и в среду писал...
Vladimir 16.04.2004 20:44
Между прочим, некоторые применяли алгоритм Барроуза-Уиллера в Архиваторе, и это помогло им сдать задачу F - Spy, в которой применяется одноименное преобазование из этого алгоритма. Так что НАДО было Архиватор писать между турами! А как мы увидим завтра, это еще и деньги приносит :)
Павел 16.04.2004 22:30
Цитата:
А почему жюри так несправедливо поступает? В тексте задачи ведь сказано, что "входной файл содержит целое число N", а в тесте ещё какие-то служебные символы... Мы подали на аппеляцию, но нам отказали - сказали. что нигде не написано, что этих лишних символов нет...
Выглядело достаточно наивно :))
Во-первых, аппеляция после обявления результатов - занятие заведомо бессмысленное.
Во-вторых, в любом случае все участники были в равном положении.
В-третьих, почти наверняка во всех тестах всех задач был последний перевод строки (ну или почти во всех)
Почему же вы подали на аппеляцию, только по задаче Е? ;)
Фраза в строке находится число, вообще говоря, не означает даже, что ведущих пробелов нет! Хотя, это была бы уже достаточно жесткая подлянка со стороны жюри ;)
В пятых. Если уж вы пользуетесь посимвольным вводом, то надо всегда держать в голове тот факт, что в перевод строки вы прочитаете как и обычный символ.
В шестых, на ваш (ваш?) вопрос о ведущих нулях, жюри ответило "без комментариев". В данном случае это говорило о том, что обрабатывать надо было максимально общую ситуацию. В частности, если бы мне так ответили, я бы пропустил все ведущие пробелы и нули.... Работы - мизер, зато наверняка... Надо учиться правильно интерпретировать ответы жюри!
И, наконец, в строку это надо было читать! Они в Delphi дли-и-и-нные :)) И перевод строки бы не прочитался в этом случае :))
penartur 16.04.2004 23:18
По этой задаче мы задавали жюри лишь один вопрос: верен ли сэмпл (обычно тест номер 1 - это сэмпл и есть).
А о том, чтобы считать это в строку, я не подумал, мы в это время били другую задачу (I: её мы так и не добили, там надо было другой алгоритм)...
penartur 29.04.2004 11:02
Кстати, вроде бы Расковалов валился на 16 тесте?
Там что было?
Попытался сейчас на Тимусе сдать - WA #16. Сначала было WA #1... потом до менядошло, что на тимусе стандартный ввод.вывод :-)
Павел 29.04.2004 14:08
penartur:
Кстати, вроде бы Расковалов валился на 16 тесте?
Там что было?
Попытался сейчас на Тимусе сдать - WA #16. Сначала было WA #1... потом до меня дошло, что на тимусе стандартный ввод.вывод :-)
Попробуй прогнать программу, например, на числе 230 ;)
Ответ, очевидно, должен быть 101:
первый разряд надо прогнать от 0 до 2-ки, чтобы проверить. На это уйдет 101 этаж. А младшие разряды за это время проверятся сами.
penartur 29.04.2004 17:26
101 и есть...
input.txt:
32 33 30 0D 0A
output.txt:
31 30 31
А ты, что ли, знаешь, что это за тест?
Павел 29.04.2004 18:11
penartur:
101 и есть...
input.txt:
32 33 30 0D 0A
output.txt:
31 30 31
А ты, что ли, знаешь, что это за тест?
есть маленько...
Ага! Значит все дело в волшебных... строках :)
На тимусе компилируется FreePascal-ем, который не знает длинных строк.
16 тест - это первый, на котором длина числа превышает 255 символов.
Возможно из-за этого глюк. Собственно, это последняя известная мне особенность 16-ого теста :)
Сандро 29.04.2004 19:06
penartur:
Кстати, вроде бы Расковалов валился на 16 тесте?
Это неправда. Валились тесте на 11, по-моему, в общем, там, где число 30 или 30 с чем-то было.
Да там вообще ведь все число не надо читать, так что проблемы с длинными строками необоснованны. Хотя мы читали, но мы-то ведь на Си пишем.