Котлы

From
Max Alekseyev (2:5015/60)
To
Anton Kuznetsov
Date
2002-11-12T14:25:04Z
Area
RU.ALGORITHMS
████ OS/2        Hi, Anton !

Replying to a message of Anton Kuznetsov to All:

 AK>  Дано N котлов размерами А1, А2, А3... Аn литров + есть бесконечный
 AK> котел с водой. Из большого котла можно зачерпывать котлы только
 AK> целиком, а вокогда переливают воду из котла Ai в Aj, то продолжается
 AK> это до тех пор пока во втором котле есть куда воду пихать и пока есть
 AK> откуда воду брать...

 AK>  Вообщем вопрос такой можно ли набрать M литров?

Вот решение для двух котлов:

===cut===
var n,m,k,x,u,v:longint;
    a,a2,b,b2,t:longint;
    j1,j2:char;

begin
write('Input A B M = '); readln(n,m,k);
v:=m; x:=n; a:=1; a2:=0; b:=0; b2:=1;
repeat
  u:=x; t:=v div x; x:=v mod x; v:=u;
  u:=a2; a2:=a-t*a2; a:=u;
  u:=b2; b2:=b-t*b2; b:=u;
until x=0;
{ we got v = gcd(n,m) = a*m + b*n }
if k mod v<>0 then
begin
  writeln('Impossible!');
  halt;
end;
a:=a*k div v; b:=b*k div v;
if a<0 then
begin
  t:=(abs(a)+n-1) div n; inc(a,t*n); dec(b,t*m);
end;
t:=a div n; dec(a,t*n); inc(b,t*m);
if abs(a)+abs(b)<=(n+m) shr 1 then
begin
  j1:='A'; j2:='B';
end else
begin
  j1:='B'; j2:='A';
  u:=m; m:=n; n:=u;
end;

v:=0;
repeat
  writeln('Fill up jug ',j2);
  u:=m;
  repeat
    writeln('Pour water from jug ',j2,' into jug ',j1);
    if u+v>n then begin dec(u,n-v); v:=n end
             else begin inc(v,u); u:=0 end;
    if u=k then
    begin
      writeln('Well done! There are exactly ',k,' liters in jug B.');
      halt;
    end;
    if v=n then
    begin
      writeln('Empty jug ',j1);
      v:=0;
    end;
  until u=0;
until 0<>0;

end.
===cut===

Regards,      °°
        Max    ~

--- FleetStreet 1.27.3.8
 * Origin:  (2:5015/60)