Задачи   районной олимпиады

 

Задачи   районной олимпиады

по информатике 2008 с  решением 

 

1.   Королевский  карлик

Король издал приказ об отыскании в королевстве самого маленького человека  для предоставления его ко двору в качестве королевского карлика. Необходимо сказать королю сколько у него подданных самого низкого роста, и каков этот рост.                                             (N≤500000,       все числа ≤ 2*109 )

 

Программа на Turbo Pascal:

program olimp1;

uses crt;

const k1='Input1.pas';

          k2='Output1.pas';

var input1,output1:  text;

      n,min,a,m,i   :longint;

begin clrscr; textcolor(7); textbackground(10);

assign(input1,k1); reset(input1);

assign(output1,k2); rewrite(output1);

readln(input1,n); read(input1,min); m:=1;

for i:=2 to n do begin  read(input1,a);

if a<min then begin min:=a; m:=1; end

               else if a=min then m:=m+1;  end;

writeln(output1,'min=',min:3);

writeln(output1,'n=',m:3);

close(output1);  end.

2. Семеричная  цифра

Вводится натуральное десятичное число N>99. Определить предпоследнюю цифру этого числа, переведенного в семеричную систему счисления.                                                     ( количество цифр числа ≤ 500000 )

Программа на Turbo Pascal:

program a22;

uses crt;

const k1='Input2.PAS';

      k2='Output2.PAS';

var   Input2,Output2  :text;

      i,n,m,d,j,k   :integer;   c   :char;

begin clrscr; textcolor(10); textbackground(5);

      assign(Input2,k1); reset(Input2);

      assign(Output2,k2); rewrite(Output2);

      read(Input2,c); val(c,k,i);

      if k>=7 then begin n:=k-7; m:=1; end

              else begin n:=k; m:=0; end;

      While not seekeof(Input2) do begin

      read(Input2,c); val(c,k,i);

      j:=10*n+k; n:=j mod 7; j:=j div 7;

      m:=(m*10+j) mod 7; d:=(m*10+j) div 7;

      end;        writeln(Output2,m:2);

      close(Output2);  end.

3. Параллелограммы

В семье математиков Затылочевских есть интересная игра. Они по очереди называют целые числа, а потом разбивают всю последовательность на отрезки по 6 чисел. Каждая пара считается координатами одной из вершин параллелограмма, для которого вычисляется его площадь. Параллелограмм считается «удачным», если его площадь является целым чётным числом. Младший член семьи Затылокочевских захотел вести вычисления с помощью компьютера. Помогите ему. (Кол. строк≤50000, все числа ≤ 2*109)

Программа на Turbo Pascal:

program a23;

uses crt;

const k1='Input3.pas';

      k2='Output3.pas';

var Input3,Output3: text;

    x1,x2,x3,y1,y2,y3,k,i,m,n,d: longint;

    d1,d2,d3,p,s: real;

begin clrscr; textcolor(10);textbackground(5);

assign(Input3,k1); reset(Input3);

assign(Output3,k2); rewrite(Output3);

m:=0;

While not seekeof(Input3) do begin

readln(Input3,x1,y1,x2,y2,x3,y3);

d1:=sqrt(sqr(x1-x2)+sqr(y1-y2));

d2:=sqrt(sqr(x1-x3)+sqr(y1-y3));

d3:=sqrt(sqr(x3-x2)+sqr(y3-y2));

 p:=(d1+d2+d3)/2;

s:=sqrt(p*(p-d1)*(p-d2)*(p-d3));

d:=trunc(s); 

if d mod 2=0 then m:=m+1; end;

writeln(Output3,m:3);

close(Output3); end.

4.  Счастливые билетики

В городе Екцепил в связи с использованием билетов на городском транспорте, как лотерейных билетов, их номера стали состоять из различного количества цифр. Поэтому теперь билет стали считать счастливым, если совокупность всех его цифр можно разбить на две части так, чтобы сумма цифр одной части равнялись сумме цифр другой. Требуется написать программу, которая среди заданных номеров билетов найдет счастливые.    (N≤3000,   кол. цифр100 )

Программа на Turbo Pascal:

program a24;

uses crt;

const k1='Input4.pas';

      k2='Output4.pas';

label vo;

var Input4,Output4: text;

    d1,d2,p,k,i,m,n,l,j,d: integer;  s: string;

    a:    array[1..100] of integer;

 begin clrscr; textcolor(10);textbackground(5);

assign(Input4,k1); reset(Input4);

assign(Output4,k2); rewrite(Output4);

readln(Input4,n);

for i:=1 to n do begin

readln(Input4,s);

for j:=1 to 100 do a[j]:=0; j:=0;

for k:=1 to length(s) do begin

val(s[k],m,d); j:=j+1; a[j]:=m; end;

 if j=1 then begin p:=0; goto vo; end;

 if j=2 then begin

if a[1]=a[2] then p:=1 else p:=0;

goto vo; end;

if j>2 then begin p:=0;

d1:=0; for k:=1 to j do d1:=d1+a[k];

     for k:=1 to j do begin d2:=0;

         for l:=1 to k do d2:=d2+a[l];

         if d2=d1-d2 then p:=1; end; end;

vo:      writeln(Output4,p:3);     end;

   close(Output4); end.