Олимпиада для 3 курса. Задача 1. Медиана последовательности Пусть задана последовательность из N целых неотрицательных чисел. Медианой такой последовательности в случае нечетного N называется элемент, который будет равноудален от концов последовательности, если ее отсортировать по возрастанию или убыванию (нетрудно сообразить, что этот элемент имеет номер (N+1)/2 в отсортированной последовательности, если номера считать с единицы). В случае четного N медианой называется среднее арифметическое двух элементов, которые окажутся на местах N/2 и (N/2)+1, если последовательность отсортировать. Однако исходная последовательность не обязана быть отсортированной. Напишите программу, которая по заданной входной последовательности вычисляет ее медиану. Исходные данные В первой строке входа содержится число N — длина последовательности. Во второй и последующих строках расположены сами элементы последовательности, по одному в каждой строке. Длина последовательности — целое число от единицы до 250 000. Каждый элемент последовательности — целое число от 0 до (232−1) включительно. Результат. Программа должна выдать значение медианы с точностью до одного десятичного знака. Пример: исходные данные результат 4 3 6 4 5 4.5 Задача 2. Странная процедура В программировании иногда требуется тестировать и отлаживать уже существующий программный код. Представьте себе, что ваш коллега передал вам написанный им фрагмент кода, так как должен заняться разработкой другой программы. Вот этот фрагмент кода — функция с двумя входно-выходными параметрами: C++ #include <math.h> int main() { Long x=…, long y=… ; int i, j; if (x>0 && y>0) { for (i = 1; i <= x+y; i++) { y = x*x+y; x = x*x+y; y = sqrt(x+(y/labs(y))*(labs(y))); for (j = 1; j <= 2*y; j++) x = x-y; } } printf(“конечные значения х=…, y=…”,x,y); } Пример Исходные данные:1 1 Результат:1 1 Ваша задача: для отладки этой функции необходимо разработать программу, которая по выходным данным восстановит входные параметры функции. Гарантируется, что во время работы функции ни одна из переменных не выходила за пределы своего типа. Исходные данные. В единственной строке через пробел записаны два числа x и y, возвращенные функцией после работы. Результат. Выведите через пробел два числа x и y, которые были поданы функции на вход. Олимпиада для 3 курса. Задача 3. Маршрутизация Имеется сеть из нескольких компьютеров, с настроенной по правилам TCP/IP маршрутизацией. Это означает, что: 1. Каждый компьютер имеет 1 или более сетевых интерфейсов. 2. Каждый интерфейс идентифицируется IP-адресом и маской подсети — это два 4-х байтных числа, разделённые точками через каждый байт, причём в двоичном представлении маска подсети выглядит следующим образом: сначала идет k единиц, потом m нулей, k+m=8*4=32. (Например 212.220.35.77 — IP-адрес, 255.255.255.128 — маска). 3. 2 компьютера относятся к одной подсети, если (IP1 AND NetMask1) = (IP2 AND NetMask2), где IPi и NetMaski — IP-адрес и маска i-го компьютера, AND — побитовое умножение. 4. Пакет между компьютерами, находящими в одной подсети, передаётся непосредственно. 5. Пакет между компьютерами, находящимися в 2-х разных подсетях, проходит через компьютеры, имеющие интерфейсы, подключенные к нескольким подсетям, причём при переходе из подсети в подсеть компьютер, на котором осуществляется этот переход, должен иметь интерфейсы, относящиеся к обеим подсетям. Задача состоит в том, чтобы найти кратчайший путь пакета между двумя указанными компьютерами. Исходные данные На входе в первой строке стоит число N — количество компьютеров в сети, далее идет N секций, описывающих интерфейсы каждого компьютера. В первой строке секции стоит число K — количество интерфейсов этого компьютера, затем K строк — это описания интерфейсов, т.е. его IP-адрес и маска подсети. В последней строке входа стоят два числа — номера компьютеров между которыми надо найти путь. Известно, что 2 ≤ N ≤ 90 и K ≤ 5. Результат Слово «Yes» если путь существует, затем в следующей строке через пробел номера компьютеров, через которые проходит путь. Или слово «No», если такого пути не существует. Пример исходные данные результат 6 Yes 2 1 3 5 6 10.0.0.1 255.0.0.0 192.168.0.1 255.255.255.0 1 10.0.0.2 255.0.0.0 3 192.168.0.2 255.255.255.0 212.220.31.1 255.255.255.0 212.220.35.1 255.255.255.0 1 212.220.31.2 255.255.255.0 2 212.220.35.2 255.255.255.0 195.38.54.65 255.255.255.224 1 195.38.54.94 255.255.255.224 1 6 Олимпиада для 3 курса. Задача 4. В некотором царстве, в некотором государстве жил-был царь, и была у него дочь — Василиса Прекрасная. Многие хотели жениться на ней, но она всем отказывала. Надоело это царю, рассердился он и повелел: "Первый, кто решит мою задачку, получит Василису Прекрасную в жёны". Решил тогда Иванушка-дурачок счастья попытать. Пришёл к царю, а тот ему и говорит: "Вот тебе программка, введи ей N чисел, она тебе и выведет на ком жениться. Даю тебе день на размышления". Посмотрел Иванушка на программу ту и запечалился: буквы какие-то непонятные, значки всякие, тут не только дурак, но и умный голову сломает. А между тем время кончается. Так и не придумал Иванушка ничего. А программка та была вот такая: На языке C Пример #include <stdio.h> long c; long A[N]; long P(long l, long r) { long x=A[l], i=l-1, j=r+1, t; while(1) { do{--j; ++c;} while(A[j]>x); do{++i; ++c;} while(A[i]<x); if(i<j) { t=A[i]; A[i]=A[j]; A[j]=t; } else return j; } } void Q(long l, long r) { long n; if(l<r) { n=P(l,r); Q(l,n); Q(n+1,r); } } int main(void) { c=0; for(long i=0; i<N; ++i) scanf("%ld", &A[i]); Q(0,N-1); if(c==(N*N+3*N-4)/2) printf ("Василиса Прекрасная"); else printf ("Кощей Бессмертный"); return 0; } Исходные данные: 3 Результат: 3 7 19 Теперь, когда вы знаете программу, вы можете попытаться помочь Иванушке. Исходные данные: В первой строке содержится число натуральное число N ≤ 1000. Результат: Вы должны вывести N чисел в одной строке таких, что если ввести их в программу, данную царём, то она выдаст "Василиса Прекрасная". Числа должны быть разделены пробелами. Если возможно несколько вариантов, выведите любой.