- •Олимпиадные задачи и решения
- •Векторы (100 баллов)
- •Погодные условия (100 баллов)
- •Шоколадные плитки (100 баллов)
- •Работники (100 баллов)
- •Робот (100 баллов)
- •Зал Круглых Столов (100 баллов)
- •Вто (100 баллов)
- •Вишня (100 баллов)
- •Алхимия (100 баллов)
- •Цепь (100 баллов)
- •Казино (100 баллов)
- •Система уравнений (100 баллов)
- •Забавный конфуз
- •Соревнование
- •Абракадабра
- •Циферблат
- •Многоугольники
- •Квадрат
- •Лабиринт
- •Задача “Шифр”
- •Задача “Школы”
- •Последовательность
- •Автобус
- •Головоломка
- •Электронная почта
- •Виртуляндия
- •Конвейер
- •Новости
Забавный конфуз
Пусть A — массив, состоящий из N элементов A1,...,AN. Обозначим его максимальное и минимальное значение как max(A) и min(A) соответственно. Вычислим сумму элементов S, S=A1+A2+…+AN. Заменим каждый элемент массива на разницу S и этого элемента: Ai:=S-Ai, 1iN. Такое преобразование массива A назовем операцией Confuse.
Задание
Напишите программу CONFUSE, которая по массиву B, полученному в результате K–кратного применения операции Confuse к некоторому массиву A, вычислит разность max(A)-min(A).
Входные данные
Первая строка входного файла CONFUSE.DAT содержит целые числа N и K, где N — количество элементов массива B (2N10000), а K — количество применений операции Confuse к начальному массиву A, 1K100. Вторая строка файла содержит N элементов массива B. Элементы массива B — целые числа, принадлежащие диапазону от -2 000 000 000 до 2 000 000 000.
Выходные данные
Единственная строка выходного файла CONFUSE.SOL должна содержать целое число, которое есть разностью max(A) и min(A).
Пример входных и выходных данных
CONFUSE.DAT |
CONFUSE.SOL |
4 2 45 52 47 46 |
7 |
{$N+,G+}
program Confuse;
var
fr, fw: text;
bmax, bmin, bi, n, k: longint;
i: integer;
answer: comp;
begin
assign(fr, 'confuse.dat');
reset(fr);
assign(fw, 'confuse.sol');
rewrite(fw);
readln(fr, n, k);
read(fr, bmin);
bmax := bmin;
for i:=2 to n do
begin
read(fr, bi);
if (bi < bmin) then
bmin := bi;
if (bi > bmax) then
bmax := bi;
end;
answer := bmax;
answer := answer - bmin;
writeln(fw, answer:0:0);
close(fw);
close(fr);
end.
Соревнование
В спортивном турнире принимает участие N человек, с номерами от 1 до N. Турнир проходит по круговой системе: каждый участник должен сыграть с каждым другим участником по одной партии, которая заканчивается победой одного из игроков. Считается, что по окончании турнира участник занимает место P, если:
у него выиграли (P-1) участников, и ему проиграли все остальные;
все участники, которые победили его, выиграли свои партии у всех участников, которые ему проиграли.
Для остальных участников итоговое место определить нельзя.
Задание
Напишите программу CONTEST, которая получает на вход число N и результаты сыгранных на данный момент партий турнира, и определяет количество участников, для которых по окончании турнира нельзя будет определить итоговое место, в независимости от результатов тех партий, которые еще будут сыграны.
Входные данные
В первой строке CONTEST.DAT задаются два натуральных числа: N — количество участников турнира (1N100) и M — количество сыгранных партий. Следующие M строк описывают сыгранные партии. В строке задается два числа: номер победителя и номер проигравшего.
Выходные данные
В единственной строке выходного файла CONTEST.SOL должно быть целое число — искомое количество участников.
Пример входных и выходных данных
CONTEST.DAT |
CONTEST.SOL |
6 8 1 5 1 4 5 2 5 6 3 2 2 6 6 4 4 3 |
4 |
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+}
{$M 16384,0,655360}
program contest;
const
FileIn = 'contest.dat';
FileOut = 'contest.sol';
MaxN = 100;
type
PList = ^TList;
TList = record
Vert : integer;
Next : PList;
end;
var
N, M : integer;
A : array[1..MaxN] of PList;
B : array[1..MaxN] of boolean;
Ans : array[1..MaxN] of integer;
Answer : integer;
Storage : array[1..MaxN] of integer;
RecFlag : boolean;
Curr : integer;
procedure EmptyGraph;
var
i : integer;
begin
for i:=1 to MaxN do
A[i] := nil;
end;
procedure AddEdge(x, y : integer);
var
p : PList;
begin
New(P);
P^.Vert := y;
P^.Next := A[x];
A[x] := p;
end;
procedure Init;
var
Fi : Text;
i, Winner, Loser : integer;
begin
FillChar(Ans, SizeOf(Ans), 0);
EmptyGraph;
Assign(Fi, FileIn);
Reset(Fi);
ReadLn(Fi, N, M);
for i:=1 to m do
begin
ReadLn(Fi, Winner, Loser);
AddEdge(Winner, Loser);
end;
Close(Fi);
Answer := 0;
end;
procedure AddCycle(CurrVert, PrevVert : integer);
var
x : integer;
begin
x:=PrevVert;
while x<>CurrVert do
begin
Ans[x]:=2;
x:=Storage[x];
end;
Ans[CurrVert]:=2;
end;
procedure Search(Vert, Prev : integer);
var
p : PList;
begin
Storage[Vert] := Prev;
B[Vert] := true;
if Ans[Vert]=0 then Ans[Vert]:=1;
p:=A[Vert];
while p<>nil do
begin
if Storage[p^.Vert]=0 then
begin
Search(p^.Vert, Vert);
end else
begin
if B[p^.Vert] then AddCycle(p^.Vert, Vert);
end;
p:=p^.Next;
end;
B[Vert] := false;
end;
procedure Run;
begin
for Curr:=1 to n do
if Ans[Curr]<2 then
begin
FillChar(Storage, SizeOf(Storage), 0);
FillChar(B, SizeOf(B), false);
Search(Curr, -1);
end;
end;
procedure Done;
var
Fo : Text;
i : integer;
begin
for i:=1 to n do
if Ans[i]=2 then Inc(Answer);
Assign(Fo, FileOut);
Rewrite(Fo);
WriteLn(Fo, Answer);
Close(Fo);
end;
begin
Init;
Run;
Done;
end.