Коды задач муниципального тура 2018 г. (7-8 класс)

Решения некоторых задач даны в нескольких вариантах: даны эффективные по времени и памяти решения, которые приняты системой проверки как оптимальные, и решения, в которых произошло превышение времени тестирования на больших числах.

Задача  A "Спасите животных" (7-8 класс)

1 способ (превышение времени)

Нахождение наибольшей суммы 2-х элементов массива.
var n,i,m1,j:longint;
a:array [1..1000000] of longint;
begin
readln(n);
for i:=1 to n do read(a[i]);
m1:=-1;
for i:=1 to n do
for j:= i+1 to n do
begin
if (a[i]+a[j]) >m1 then m1:=a[i]+a[j];
end;
writeln(m1);
end.

2 способ (превышение времени)

Использование сортировки "пузырьком".
var n,i,m,k,j,x:longint;
a:array [1..1000000] of longint;
begin
readln(n);
for i:=1 to n do read(a[i]);
m:=-1;
//сортировка пузырьком
for i:=1 to n-1 do begin
         for j:=i+1 to n do begin
           if a[i]>a[j] then begin
              x:=a[i]; a[i]:=a[j]; a[j]:=x;
           end;
         end;
     end;
writeln(a[n]+a[n-1]);
end.

3 способ (полное решение)

Нахождение двух максимумов.
var n,i,m1,m2:longint;
a:array [1..1000000] of longint;
begin
readln(n);
for i:=1 to n do read(a[i]);

m1:=-1;
for i:=1 to n do 
begin
if a[i] >m1 then m1:=a[i];
end;

for i:=1 to n do 
begin
if a[i]=m1 then begin a[i]:=-1;break;end
end;

m2:=-1;
for i:=1 to n do 
begin
if (a[i] >m2) then m2:=a[i];
end;
writeln(m1+m2);
end.

4 способ (полное решение)
Использование "быстрой сортировки"
var n,i:integer;
a:array [1..1000000] of integer;
//быстрая сортировка
procedure sort(nstsrt,nend:integer);
var l,r,c,x:integer;
begin
if nstsrt>=nend then exit;
l:=nstsrt;
r:=nend;
x:=a[(l+r) div 2];
while l<=r do
begin
  while a[l]<x do l:=l+1;
  while a[r]>x do r:=r-1;
  if l<=r then 
    begin
    c:=a[l];
    a[l]:=a[r];
    a[r]:=c;
    l:=l+1;
    r:=r-1;
    end;
end;
sort(nstsrt,r);
sort(l,nend);
end;

begin
readln(n);
for i:=1 to n do read(a[i]);
sort(1,n);
write(a[n]+a[n-1]);
end.
 

Задача B "Восточный экспресс"
var s,k,l:int64;
begin
read(s,k,l);
write(((s*1000) div (k*l))div 60);
end.

Задача C "Ньют и игра"

1 способ (полное решение)
var n,i,j,k2,k3:integer;
s1,s2,s3:string;
begin
readln(n);
readln(s1);
readln(s2);
readln(s3);
//доработка контрольной строки
for i:=1 to n-1 do 
for j:=i+1 to n do if s1[i]=s1[j] then s1[j]:='0';
k2:=0;
k3:=0;
for i:=1 to n do
for j:=1 to n do
begin
if s1[i]=s2[j] then  k2:=k2+1;
if s1[i]=s3[j] then k3:=k3+1;
end;
if k3>k2 then begin writeln('freedom');writeln(s3);end;
if k3<k2 then begin writeln('captivity');writeln(s2);end;
if (k3=k2)and(k3>0) and(k2>0) then write(0);
if (k3=0) and (k2=0) then write(-1);
end.

 

Категория: Муниципальная олимпиада | Добавил: админ (27.12.2018)
Просмотров: 370