Discussion of Problem 1525. PathWA 8. const Nmax=111111; var path:array[1..Nmax] of char; N,M,K,pic,d,dmax,i,L,now:longint; ch:char; ans1,ans2,ans3:int64;
begin readln(N,M,K); L:=0; read(ch); while(ch='u')or(ch='d')or(ch='r')or(ch='l')or(ch='f')or(ch='b') do begin inc(L); path[L]:=ch; read(ch); end;
pic:=1; d:=1; dmax:=1; now:=1; for i:=1 to L do begin if(path[i]='l') then begin if(now=1) then begin inc(d); if(dmax<d) then dmax:=d; end else begin dec(now); if(now=1) then begin d:=1; if(dmax<d) then dmax:=d; end; end; end; if(path[i]='r') then begin if(now=N) then pic:=N else begin inc(now); d:=0; if(now>pic) then pic:=now; end; end; end;
ans1:=1; i:=2; while(i<=N)and(pic<N) do begin if(i-1>=dmax) then inc(pic); if(i-1>=dmax)and(pic<=N) then inc(ans1); inc(i); end;
pic:=1; d:=1; dmax:=1; now:=1; for i:=1 to L do begin if(path[i]='d') then begin if(now=1) then begin inc(d); if(dmax<d) then dmax:=d; end else begin dec(now); if(now=1) then begin d:=1; if(dmax<d) then dmax:=d; end; end; end; if(path[i]='u') then begin if(now=M) then pic:=M else begin d:=0; inc(now); if(now>pic) then pic:=now; end; end; end;
ans2:=1; i:=2; while(i<=M)and(pic<M) do begin if(i-1>=dmax) then inc(pic); if(i-1>=dmax)and(pic<=M) then inc(ans2); inc(i); end;
pic:=1; d:=1; dmax:=1; now:=1; for i:=1 to L do begin if(path[i]='b') then begin if(now=1) then begin inc(d); if(dmax<d) then dmax:=d; end else begin dec(now); if(now=1) then begin d:=1; if(dmax<d) then dmax:=d; end; end; end; if(path[i]='f') then begin if(now=K) then pic:=K else begin d:=0; inc(now); if(now>pic) then pic:=now; end; end; end;
ans3:=1; i:=2; while(i<=K)and(pic<K) do begin if(i-1>=dmax) then inc(pic); if(i-1>=dmax)and(pic<=K) then inc(ans3); inc(i); end;
write(ans1*ans2*ans3); end. Рассуждения такие: 1)как только достигнуто значение верхней границы,то все последующие шаги бессмысленны,т.к. пути совпадут; 2)пока первые i точек попадают в минимум у 1-ой точки (т.е. можно построить график зависимости номера шага от его значения,причем за пределы значений нельзя выходить и потому строим график в этом случае параллельным оси шага),их всех(кроме 1-ой точки) не засчитываем,все оставшиеся(если есть) и дают ответ; 3)всё перемножаем. Re: WA 8. Сложновато как-то... моя var-секция выглядит так: var x, y, z: int64; curlr, minlr, maxlr: longint; curdu, mindu, maxdu: longint; curbf, minbf, maxbf: longint; c: char; begin ... UPD: да, и ещё, рекомендую всё-таки while not eoln do begin read(ch); ... вместо read(ch); while(ch='u')or(ch='d')or(ch='r')or(ch='l')or(ch='f')or(ch='b') ... Потому что этот второй цикл означает, что в какой-то момент будет произведена попытка считать ещё один символ, когда всё уже считано. У меня этот код при тестировании на файле иногда работает, а иногда выдаёт рантайм 201. Но если в конце второй строки делать Enter, переход на новую, то конечно проблем не возникнет, но ведь в тестах этого не гарантируется. UPD: Вот простейший тест, на котором валится. Почему именно неправильно работает, не скажу, слишком сложные вычисления какие-то. 8 1 1 llllrrrr 4 (правильно.) 8 1 1 llllrrrrrrrr 1 (правильно.) 8 1 1 rrrrllllllll 4 (неправильно.) Edited by author 04.01.2016 20:59 Re: WA 8. Изменил прогу,всё равно WA. Jane Soboleva (SumNU),я правильно рассуждаю?:я ищу 3 максимума-dmax-максимальное время,когда мы были в 1,maxb-максимальное смещение(вправо от 1) до dmax,maxa-максимальное смещение вправо уже после dmax. Т.е. если строить график пути,то r означает поднятие по оси OY,а l-спуск.Тогда мы как бы начинаем в 1 и с шагом 1 то увеличиваем ординату,то уменьшаем,причем попав в 1 мы не можем идти вниз,а потому движемся вправо,то же и с N.В итоге я ищу максимальную высоту до "ямы" длиной dmax и после. Потом рассматриваю точки i>=dmax+1,т.к. все точки меньшие попадают в яму и потому все пути совпадут.Остальные точки смещены на dmax от графика первой точки и потому они дают новые пути,если не проходят через N(ровно одна из них может проходить),т.к. значения возрастают и потому пути снова совпадут. Re: WA 8. Не уверена~ К сожалению, я сейчас не в состоянии сказать, насколько эти рассуждения правильные. У меня алгоритм был такой: я поместила робота в условную точку (0, 0, 0) бесконечного параллелепипеда, а потом просто двигаю его согласно заданной строке, параллельно отмечая самое дальнее расстояние в каждом из измерений, которое он достигает в процессе. То есть, к примеру, после rrlllll будет minlr = -3 и maxlr = 2, и расстояние = maxlr - minlr = 5 (2 - -3). И так я считаю для каждого из трёх измерений. После всего этого я получаю три таких расстояния, и вычитаю их из соответствующей им размерности измерения, а потом все эти три числа перемножаю. Вот и всё. Ну и единственный нюанс — надо проследить, чтобы каждый из трёх множителей не опустился ниже единицы, то есть хотя бы одна позиция должна остаться. Например, у нас по left/right размерность 5, и у нас lrrrrrrrr, получатся minlr -1, maxlr 7, 7 - -1 = 8, 5 - 8 = -3, -3 меньше 1, поэтому вместо -3 мы подставляем 1 при умножении. Edited by author 05.01.2016 01:39 Re: WA 8. Спасибо за идею! Правда я не совсем понял корректность,но решил по-своему: как и ты(или Вы?) нашёл максимальное смещение влево и вправо,а потом осознал,что нас интересуют такие i,что 1-minlr<=i<=N-maxlr(это получается из системы i+maxlr<=N-кол-во i,не выходящих за правую границу и i-minlr>=1-за левую;все пути остальных i совпадут в конечной точке,а если же таких i нет=> все они выходят по крайней мере за одну границу и ответ 1). Кстати,из таблицы рейтинга решений видно,что ученик превзошёл учителя))) Edited by author 05.01.2016 13:38 Re: WA 8. Можно на ты :) Поздравляю!~ Да, в этот раз решение уже более похожее на моё. Насчёт памяти — у меня даже на задачу A+B не получается тратить меньше 140кб сейчас, хотя у некоторых, я вижу, выходит около 80 и меньше. Возможно, надо просто отключать или менять какие-то директивы компилятора, но я с этим не заморачивалась. |