ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1165. Subnumber

Tell me why??????????? WA!!!!!!!
Послано Levin 24 июн 2002 22:36
type tnode=array[1..500] of integer;
var a,b,c,r:tnode;
    i,j,k,v,n,tb,tc,tr:integer;
    ss:string;

procedure sub;
var i:integer;
begin
  dec(c[1]);
  i:=1;
  while c[i]=-1 do
  begin
    dec(c[i+1]);
    c[i]:=9;
    inc(i);
  end;
  if (tc>1)and(c[tc]=0) then dec(tc);
end;

procedure add;
var i:integer;
begin
  inc(c[1]);
  i:=1;
  while c[i]=10 do
  begin
    inc(c[i+1]);
    c[i]:=0;
    inc(i);
  end;
  if c[tc+1]>0 then inc(tc);
end;

function equal(x,y,k:integer):boolean;
var i:Integer;
begin
  equal:=false;
  for i:=0 to k-1 do
  if c[i+x]<>a[y+i] then exit;
  equal:=true;
end;

function check:boolean;
begin
  check:=false;
  c:=b;tc:=tb;
  k:=j+1;
  while k<=n do
  begin
    sub;
    if (tc=1)and(c[1]=0) then exit;
    if k+tc-1<=n then
    begin
      if equal(1,k,tc) then else exit;
      inc(k,tc);
    end else
    begin
      if equal(1,k,n-k+1) then else exit;
      k:=n+1;
    end;
  end;

  c:=b;tc:=tb;
  k:=j-i;
  while k>0 do
  begin
    add;
    if k-tc+1>0 then
    begin
      if equal(1,k-tc+1,tc) then else exit;
      dec(k,tc);
    end else
    begin
      if equal(tc-k+1,1,k) then else exit;
      k:=0;
    end;
  end;
  check:=true;
end;

procedure wish(k:integer);
var i:integer;
begin
  if tb>tr then exit;
  if tb<tr then
  begin
    r:=b;tr:=tb;v:=k;
    exit;
  end;
  for i:=tb downto 1 do
  begin
    if b[i]>r[i] then exit;
    if b[i]<r[i] then
    begin
      r:=b;tr:=tb;v:=k;
      exit;
    end;
  end;
  if k<v then v:=k;
end;

procedure compute;
begin
  if tr=1 then
  begin
    tc:=1;c[1]:=r[1]+v;
    exit;
  end;

  fillchar(c,sizeof(c),0);
  for i:=1 to tr-1 do
  begin
    j:=i;k:=i;
    while j>0 do
    begin
      inc(c[k],j mod 10);
      if c[k]>9 then begin inc(c[k+1]);dec(c[k],10);end;
      j:=j div 10;
      inc(k);
    end;
  end;
  if c[k]>0 then tc:=k else tc:=k-1;

  k:=0;
  for i:=1 to tc do
  begin
    c[i]:=c[i]*9+k;
    k:=0;
    while c[i]>9 do
    begin
      inc(k);
      dec(c[i],10);
    end;
  end;
  if k>0 then begin inc(tc);c[tc]:=k;end;

  j:=tr;
  dec(r[tr]);
  while (tr>0)and(r[tr]=0) do dec(tr);
  for i:=1 to tr do
  begin
    inc(c[i],r[i]*j);
    while c[i]>9 do
    begin
      inc(c[i+1]);
      dec(c[i],10);
    end;
  end;
  i:=tr+1;
  while c[i]>9 do
  begin
    while c[i]>9 do
    begin
      inc(c[i+1]);
      dec(c[i],10);
    end;
    inc(i);
  end;
  if i>tc then tc:=i;
  if c[tc]=0 then dec(tc);

  inc(c[1],v+1);
  i:=1;
  while (c[i]>9)or(c[i]<0) do
  begin
    while c[i]>9 do
    begin
      inc(c[i+1]);
      dec(c[i],10);
    end;
    while c[i]<0 do
    begin
      dec(c[i+1]);
      inc(c[i],10);
    end;
    inc(i);
  end;
  if i>tc then tc:=i;
  if c[tc]=0 then dec(tc);
end;

begin
  assign(input,'');
  reset(input);
  readln(ss);
  while ss[1]=' ' do delete(ss,1,1);
  while ss[length(ss)]=' ' do  delete(ss,length(ss),1);
  n:=length(ss);
  fillchar(a,sizeof(a),0);
  for i:=1 to n do a[i]:=ord(ss[n+1-i])-48;

  tr:=500;
  fillchar(b,sizeof(b),0);
  for i:=1 to n-1 do
  begin
    tb:=i;
    for j:=n downto n-i+1 do
    if j<i then break else
    if a[j]>0 then
    begin
      move(a[j-i+1],b[1],i*2);
      if check then wish(j-n);
    end;
    if tr<500 then break;
  end;

  if tr=500 then
  if a[n]=0 then
  begin
    tr:=n+1;
    move(a[1],r[1],n*2);
    r[tr]:=1;
    v:=1;
  end else
  begin
    tr:=n;
    move(a[1],r[1],n*2);
    v:=0;
  end;

  fillchar(c,sizeof(c),0);
  for i:=n-1 downto 1 do
  if a[i]>0 then
  begin
    tc:=n-i;
    move(a[i+1],c[1],tc*2);
    add;
    if tc>n-i then
Re: Tell me why??????????? WA!!!!!!!
Послано Yang Yi 15 окт 2002 15:32
> type tnode=array[1..500] of integer;
> var a,b,c,r:tnode;
>     i,j,k,v,n,tb,tc,tr:integer;
>     ss:string;
>
> procedure sub;
> var i:integer;
> begin
>   dec(c[1]);
>   i:=1;
>   while c[i]=-1 do
>   begin
>     dec(c[i+1]);
>     c[i]:=9;
>     inc(i);
>   end;
>   if (tc>1)and(c[tc]=0) then dec(tc);
> end;
>
> procedure add;
> var i:integer;
> begin
>   inc(c[1]);
>   i:=1;
>   while c[i]=10 do
>   begin
>     inc(c[i+1]);
>     c[i]:=0;
>     inc(i);
>   end;
>   if c[tc+1]>0 then inc(tc);
> end;
>
> function equal(x,y,k:integer):boolean;
> var i:Integer;
> begin
>   equal:=false;
>   for i:=0 to k-1 do
>   if c[i+x]<>a[y+i] then exit;
>   equal:=true;
> end;
>
> function check:boolean;
> begin
>   check:=false;
>   c:=b;tc:=tb;
>   k:=j+1;
>   while k<=n do
>   begin
>     sub;
>     if (tc=1)and(c[1]=0) then exit;
>     if k+tc-1<=n then
>     begin
>       if equal(1,k,tc) then else exit;
>       inc(k,tc);
>     end else
>     begin
>       if equal(1,k,n-k+1) then else exit;
>       k:=n+1;
>     end;
>   end;
>
>   c:=b;tc:=tb;
>   k:=j-i;
>   while k>0 do
>   begin
>     add;
>     if k-tc+1>0 then
>     begin
>       if equal(1,k-tc+1,tc) then else exit;
>       dec(k,tc);
>     end else
>     begin
>       if equal(tc-k+1,1,k) then else exit;
>       k:=0;
>     end;
>   end;
>   check:=true;
> end;
>
> procedure wish(k:integer);
> var i:integer;
> begin
>   if tb>tr then exit;
>   if tb<tr then
>   begin
>     r:=b;tr:=tb;v:=k;
>     exit;
>   end;
>   for i:=tb downto 1 do
>   begin
>     if b[i]>r[i] then exit;
>     if b[i]<r[i] then
>     begin
>       r:=b;tr:=tb;v:=k;
>       exit;
>     end;
>   end;
>   if k<v then v:=k;
> end;
>
> procedure compute;
> begin
>   if tr=1 then
>   begin
>     tc:=1;c[1]:=r[1]+v;
>     exit;
>   end;
>
>   fillchar(c,sizeof(c),0);
>   for i:=1 to tr-1 do
>   begin
>     j:=i;k:=i;
>     while j>0 do
>     begin
>       inc(c[k],j mod 10);
>       if c[k]>9 then begin inc(c[k+1]);dec(c[k],10);end;
>       j:=j div 10;
>       inc(k);
>     end;
>   end;
>   if c[k]>0 then tc:=k else tc:=k-1;
>
>   k:=0;
>   for i:=1 to tc do
>   begin
>     c[i]:=c[i]*9+k;
>     k:=0;
>     while c[i]>9 do
>     begin
>       inc(k);
>       dec(c[i],10);
>     end;
>   end;
>   if k>0 then begin inc(tc);c[tc]:=k;end;
>
>   j:=tr;
>   dec(r[tr]);
>   while (tr>0)and(r[tr]=0) do dec(tr);
>   for i:=1 to tr do
>   begin
>     inc(c[i],r[i]*j);
>     while c[i]>9 do
>     begin
>       inc(c[i+1]);
>       dec(c[i],10);
>     end;
>   end;
>   i:=tr+1;
>   while c[i]>9 do
>   begin
>     while c[i]>9 do
>     begin
>
Re: Tell me why??????????? WA!!!!!!!
Послано Yang Yi 15 окт 2002 15:34
Try this text:
99
I think the answer is 169.
86  87  88  8(9  9)0
Your output is 188.