На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Задача набрала 8 балів. Ні одного тайм аута. Допоможіть розібратися: що не так.
Program Kife; var a:array [1..255] of integer; x,x2,buf,N,p,i,j,Max,k,xx:integer; viv,L,z,koor:string; flag:boolean; Begin read (N,L); delete (L,1,1); xx:=0; x:=1; x2:=1; j:=0; buf:=N; koor:=''; for i:=1 to Length (L) do val (L[i],a[i],p); while ((N>0) and (length (L)>N)) do begin Max:=a[xx+1]; for i:=2 to N+1 do if a[xx+i]>Max then begin Max:=a[xx+i]; x:=xx+i; x2:=i; flag:=false; end; if flag then begin xx:=xx+1; str (a[xx],z); koor:=koor+z; delete (L,1,1); end else begin xx:=x; str (a[xx],z); koor:=koor+z; delete (L,1,x2); N:=N-x2+1; end; flag:=true; if N>=Length (L) then begin delete (L,1,N); N:=0; end; end; if Length (L)<=N then delete (koor,Length (koor)-N,N); L:=koor+L; writeln (L); End.
Інші я опрацьовую пока самостійно
Відредаговано MItornaDOS (2007-11-08 19:21:55)
Поза форумом
input:
249 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789
123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789
123456789123456789123456789123456789123456789123456789001
(переводы строк сделаны для нормального отображения на форуме)
твой output:
99999
мой output:
999999
И вообще везде, где на входе L имеет 255 цифр твоя прога выводит ответ без 1 символа.
Вроде все остальные тесты проходит нормально..
=> вывод: в 12 тестах длина числа была максимально возможной
+
изменяешь строчку
" viv,L,z,koor:string;" на
" viv,L,z,koor:ansistring;"
и получаешь полный балл..
Відредаговано netoi07 (2007-11-08 20:09:37)
Поза форумом
netoi07 написав:
+
изменяешь строчку
" viv,L,z,koor:string;" на1
" viv,L,z,koor:ansistring;"
и получаешь полный балл..
сенкс
а что за ansistring?
Поза форумом
ага!
вот через эту вещь срезается 255-ый символ
read (N,L); delete (L,1,1);
Поза форумом
String - строка времён Turbo Pascal, ограничение на длину - 255 символов
AnsiSting - строка времён FreePascal, ограничение на память - 2 Гб
WideString - строка времён Delphi, ограничение на память - 2 Гб, Unicode.
Теоретически здесь можно обойтись и без AnsiString, чуть видоизменив считывание вот так:
var N: integer;
c: char;
L:string;
Begin
read (N,c);
readln(L);
Поза форумом
Skiminok написав:
String - строка времён Turbo Pascal, ограничение на длину - 255 символов
AnsiSting - строка времён FreePascal, ограничение на память - 2 Гб
WideString - строка времён Delphi, ограничение на память - 2 Гб, Unicode.
Теоретически здесь можно обойтись и без AnsiString, чуть видоизменив считывание вот так:
var N: integer;
c: char;
L:string;
Begin
read (N,c);
readln(L);
Я понял, спасибо!
Поза форумом
Вот задача проходит 8 тестов, остальные "Time Out"
program Military; {$H+} var s,z:string; i,j,c:longint; begin readln (s); i:=0; j:=0; while pos ('><',s)<>0 do begin while pos (' ',s)<>0 do delete (s,pos (' ',s),1); z:=s; while pos ('><',s)<>0 do begin c:=pos ('><',s); delete (s,c,2); delete (z,c,2); insert ('<>',z,c); insert (' ',s,c); j:=j+1; end; s:=z; i:=i+1; end; writeln (i,' ',j); {$H-} end.
Поза форумом
Правильно. Такое решение больше набирать и не должно.
Видимо, таймов раньше не было из-за обрезки строки по 256 символам.
Поза форумом
reiten написав:
Правильно. Такое решение больше набирать и не должно.
Видимо, таймов раньше не было из-за обрезки строки по 256 символам.
а что сделать то?
Поза форумом
Искать алгоритмически верное решение.
Там есть линейный алгоритм на самом деле.
Мой код:
#include <cstdio> using namespace std; const int maxL=90000; char seq[maxL+5]; int main() { scanf(" %[<>]",seq); int time,i,before; long long moves; for(i=0,time=moves=before=0;seq[i];i++) if(seq[i]=='>')before++; else { moves+=before; if(before) { if(time+1<before)time=before; else time++; } } printf("%d %Ld\n",time,moves); return 0; }
Поза форумом
reiten написав:
Искать алгоритмически верное решение.
Там есть линейный алгоритм на самом деле.
Мой код:Код:
#include <cstdio> using namespace std; const int maxL=90000; char seq[maxL+5]; int main() { scanf(" %[<>]",seq); int time,i,before; long long moves; for(i=0,time=moves=before=0;seq[i];i++) if(seq[i]=='>')before++; else { moves+=before; if(before) { if(time+1<before)time=before; else time++; } } printf("%d %Ld\n",time,moves); return 0; }
знаю только паскаль/делфи
Поза форумом
Вот полностью работающее решение на Делфи (или на Фри):
program Military4; {$APPTYPE CONSOLE} type integer=longint; var pc, c: char; qr, time, quan: Integer; function max(a,b: integer): Integer; begin if a>b then max:=a else max:=b end; begin repeat Read(c) until (c='>') or eoln; qr:=1; time:=0; quan:=0; pc:=c; while not eoln do begin Read(c); if c='>' then Inc(qr) else begin Inc(quan,qr); if pc='>' then time:=max(qr,time+1) else inc(time) end; pc:=c; end; Writeln(time,' ',quan); end.
Поза форумом