Решите задачу с прошлой олимпиады, ** языке pascal abc.net

0 голосов
48 просмотров

Решите задачу с прошлой олимпиады, на языке pascal abc.net


image

Информатика (1.8k баллов) | 48 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Для небольших значений k вполне подойдет очередь.

var i,n,k,lf,rt,bg,nd: integer;
    a: array[1..50000] of integer;
begin
  write('N = ');  readln(n);
  write('K = ');  readln(k);
  for i:=1 to 50000 do a[i]:=0;
  bg:=1;  nd:=1;
  a[bg]:=n;
  repeat
    n:=a[bg];
    if n mod 2 = 0 then lf:=(n div 2)-1 
    else lf:=n div 2;
    if n mod 2 = 0 then rt:=lf+1
    else rt:=lf;
    inc(nd);
    a[nd]:=rt;  inc(nd);
    a[nd]:=lf;
    inc(bg);
    dec(k);
    if nd>49500 then 
    begin
      writeln('слишком большое k');
      exit;
    end;  
  until k=0;
  writeln(lf,' ',rt);
end.  


N = 12456987
K = 23198
379 379

N = 20
K = 4
2 2

N = 20
K = 5
1 2









(9.7k баллов)
0

Программа работает не правильно.

0

В очереди длины отрезков не упорядочены по убыванию.

0

Задача еще актуальна? Есть вариант решения, время 0,1 сек при n порядка 10^18. N = 987456321753159428
K = 5247896235428861
218 218
время работы программы: 100 мск.

0

да

0

вполне

0

Вы в контакте (VK) есть?

0

Решение зафиксировано, не корректируется, в комментарии не войдет по длине, мой id в контакте id462257808.