На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Задача набрала 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.Поза форумом