Cod sursa(job #183583)

Utilizator victor_bla_blaDumitrescu Victor victor_bla_bla Data 22 aprilie 2008 13:07:47
Problema Operatii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.22 kb
program operatii;
type nr=0..100000;
type vector=array[0..20] of byte;
var a: array[1..1000000] of longint;
sv: vector;
n,i,ip,s,op,min,k: longint;
g: boolean;
f: text;
procedure adunare;
var j,t: integer;
v: vector;
d: longint;
begin
     d:=a[i]; v[0]:=0;
     while d>0 do
     begin
        inc(v[0]);
        v[v[0]]:=d mod 10;
        d:=d div 10;
     end;
     t:=0; j:=1;
     while (j<=sv[0]) or (j<=v[0]) or (t>0) do
     begin
          t:=t+sv[j]+v[j];
          sv[j]:=t mod 10;
          t:=t div 10;
          inc(j);
     end;
     sv[0]:=j-1;
end;
procedure scadere;
var i,t: integer;
v: vector;
d: longint;
begin
     d:=min; v[0]:=0;
     while d>0 do
     begin
        inc(v[0]);
        v[v[0]]:=d mod 10;
        d:=d div 10;
     end;
     t:=0; i:=1;
     while (i<=sv[0]) or (t>0) do
     begin
          sv[i]:=sv[i]-v[i]-t;
          if sv[i]<0 then t:=1
          else t:=0;
          sv[i]:=sv[i]+t*10;
          inc(i);
     end;
     while (sv[0]>0) and (sv[sv[0]]=0) do
           dec(sv[0]);
end;

begin
        assign(f,'operatii.in');
        reset(f);
        read(f,n); g:=true;

        for i:=1 to n do
        begin
                read(f,a[i]);
                if (maxlongint-a[i]>=s) and (g=true) then s:=s+a[i]
                else
                        if g=false then adunare
                        else
                        begin
                                g:=false;
                                while s>0 do
                                begin
                                        inc(sv[0]);
                                        sv[sv[0]]:=s mod 10;
                                        s:=s div 10;
                                end;
                                adunare;
                        end;
        end;
        close(f);
        if g=true then
             while s>0 do
             begin
             for i:=1 to n do
                 if a[i]<>0 then
                 begin
                    ip:=i; min:=a[i];
                    while a[ip+1]<>0 do
                    begin
                         inc(ip);
                         if a[ip]<min then min:=a[ip];
                    end;
                    for k:=i to ip do
                    begin
                        a[k]:=a[k]-min;
                        s:=s-min;
                    end;
                    op:=op+min;
                    i:=ip;
                 end;
             end;
        if g=false then
             while sv[0]>0 do
             begin
             for i:=1 to n do
                 if a[i]<>0 then
                 begin
                    ip:=i; min:=a[i];
                    while a[ip+1]<>0 do
                    begin
                         inc(ip);
                         if a[ip]<min then min:=a[ip];
                    end;
                    for k:=i to ip do
                    begin
                        a[k]:=a[k]-min;
                        scadere;
                    end;
                    op:=op+min;
                    i:=ip;
                 end;
             end;
     assign(f,'operatii.out');
     rewrite(f);
     write(f,op);
     close(f);
end.