Структуры и алгоритмы компьютерной обработки данных

Задания

Разбить на страницы
Показывать лекцию целиком

Задание 1. Указатели

Решите уравнение указанным в варианте методом. Функцию передать как параметр с помощью указателя.

Численные методы решения уравнений

Довольно часто на практике приходится решать уравнения вида:$$F(x)=0$$ где функция $$F(x)$$ определена и непрерывна на некотором конечном или бесконечном интервале$$\alpha < x < \beta$$

Всякое значение $$\overline{x}$$ такое, что $$F(\overline{x})\equiv 0$$, называется корнем уравнения, а нахождение этого значения и есть решение уравнения.

На практике в большинстве случаев найти точное решение возникшей математической задачи не удается. Поэтому важное значение приобрели численные методы, позволяющие найти приближенное значение корня. Под численными методами подразумеваются методы решения задач, сводящиеся к арифметическим и некоторым логическим действиям над числами, т.е. к тем действиям, которые выполняет компьютер.

Существует множество численных методов решения уравнений вида (1). Рассмотрим только три из них:

  • метод итераций;
  • метод Ньютона;
  • метод половинного деления.
  • Метод итераций

    Представим уравнение $$F(x)=0$$ в виде:$$x=f(x)$$

    Это уравнение получается выделением $$x$$ из уравнения $$F(x)$$ и переносом того, что осталось, т.е. $$f(x)$$, в левую часть уравнения. Иначе можно получить уравнение (2) следующим способом: левую и правую часть уравнения (1) умножить на произвольную константу $$\lambda$$ и прибавить к левой и правой части $$x$$, т.е. получаем уравнение вида:$$x=x+\lambda F(x)$$ где $$f(x)=x+\lambda F(x)$$.

    На заданном отрезке $$[a; b]$$ выберем точку $$х_0$$ – нулевое приближение – и найдем$$x_1=f(x_0),$$ потом найдем:$$x_2=f(x_1),$$

    Таким образом, процесс нахождения корня уравнения сводится к последовательному вычислению чисел:$$x_n=f(x_{n-1})\quad n=1,2,3 \ldots .$$ Этот процесс называется методом итераций.

    Если на отрезке $$[a; b]$$ выполнено условие:$$|f'(x_0)|\leq q<1,$$ то процесс итераций сходится, т.е.$$\lim_{n\rightarrow\infty}x_n=\overline{x}$$

    Процесс итераций продолжается до тех пор, пока$$|x_n-x_{n-1}|\leq\varepsilon,$$ где – $$\varepsilon$$ заданная абсолютная погрешность корня $$x$$. При этом будет выполняться:$$|\overline{x}-x_n|\leq\varepsilon,$$

    Метод Ньютона

    Пусть уравнение $$F(x)=0$$ имеет один корень на отрезке $$[a; b]$$, причем $$F'(x)$$ и $$F''(x)$$ определены, непрерывны и сохраняют постоянные знаки на отрезке $$[a; b]$$.

    Выберем на отрезке $$[a; b]$$ произвольную точку $$х_0$$ – нулевое приближение. Затем найдем:$$x_1=x_0-\frac{F(x_0)}{F'(x_0)}$$ потом$$x_2=x_1-\frac{F(x_1)}{F'(x_1)}$$

    Таким образом, процесс нахождения корня уравнения сводится к вычислению чисел $$x_n$$ по формуле:$$x_n=x_{n-1}-\frac{F(x_{n-1})}{F'(x_{n-1})},\quad n=1,2,3\ldots$$

    Этот процесс называется методом Ньютона.

    Процесс вычисления продолжается до тех пор, пока не будет выполнено условие:$$|x_n-x_{n-1}|\leq\varepsilon,$$ где – $$\varepsilon$$ заданная абсолютная погрешность корня $$x$$.

    Точку $$х_0$$ необходимо выбирать так, чтобы выполнялось условие:$$F(x_0)\dot F'(x_0)>0,$$ иначе метод не будет сходиться.

    Метод половинного деления

    Пусть уравнение $$F(x_0)$$ имеет один корень на отрезке $$[a, b]$$. Функция непрерывна на отрезке $$[a, b]$$.

    Метод половинного деления заключается в следующем:

    Сначала выбираем начальное приближение, деля отрезок пополам, т.е.$$x_0=(a+b)/2.$$

    Если $$F(x_0)=0$$, то $$x_0$$ является корнем уравнения. Если $$F(x_0)\neq 0,$$ то выбираем тот из отрезков, на концах которого функция имеет противоположные знаки. Полученный отрезок снова делим пополам и выполняем действия сначала и т.д.

    Процесс деления отрезка продолжаем до тех пор, пока длина отрезка, на концах которого функция имеет противоположные знаки, не будет меньше заданной точности $$\varepsilon$$, т.е. пока не будет выполняться условие:$$|x_n-x_{n-1}|\leq\varepsilon.$$

    Варианты задания

    Уравнение Отрезок, содержащий корень Метод Значение корня с точностью 10-4
    1 $$3\sin\sqrt{x}+0,35x-3,8=0$$ [2;3] Итераций 2,2985
    2 $$0,25x^3+x-1,2502=0$$ [0;2] Ньютона 1,0001
    3 $$x-\frac{1}{3+\sin 3,6x}=0$$ [0;0,85] Итераций 0,2624
    4 $$0,1x^2-x\ln x=0$$ [1;2] Ньютона 1,1183
    5 $$\tg x=\frac13\tg^3 x+\frac15\tg^5 x-\frac13=0$$ [0;8] Половинного деления 0,3333
    6 $$\arccos x-\sqrt{1-0,3 x^3}=0$$ [0;1] Итераций 0,5629
    7 $$3x-4\ln x-5=0$$ [2;4] Ньютона 3,2300
    8 $$\cos\frac{2}{x}-2\sin\frac{1}{x}+\frac{1}{x}=0$$ [1;2] Половинного деления 1,8756
    9 $$\sqrt{1-0,4x^2}-\arcsin x=0$$ [0;1] Итераций 0,7672
    10 $$e^x-e^{-1}-2=0$$ [0;1] Ньютона 0,8814
    11 $$\sin(\ln x)-\cos(\ln x)+2\ln x=0$$ [1;3] Половинного деления 1,3749
    12 $$x-2+\sin\frac{1}{x}=0$$ [1,2;2] Итераций 1,3077
    13 $$e^x+\ln x-10x=0$$ [3;4] Ньютона 3,5265
    14 $$\cos x-e^{\frac{-x^2}{2}}+x-1=0$$ [1;2] Половинного деления 1,0804
    15 $$1-x+\sin x-\ln(1+x)=0$$ [0;1,5] Итераций 1,1474
    16 $$3x-14+e^x-e^{-x}=0$$ [1;3] Ньютона 2,0692
    17 $$\sqrt{1-x}-\tg x=0$$ [0;1] Половинного деления 0,5768
    18 $$x+\cos(x^{0.52}+2)=0$$ [0,5;1] Итераций 0,9892
    19 $$3\ln^2 x+6\ln x-5=0$$ [1;3] Ньютона 1,8832
    20 $$\sin x^2+\cos x^2-10x=0$$ [0;1] Половинного деления 0,1010
    21 $$x^2-\ln(1+x)-3=0$$ [2;3] Итераций 2,0267
    22 $$2x\sin x-\cos x=0$$ [0,4;1] Ньютона 0,6533
    23 $$e^x+\sqrt{1+e^{2x}}-2=0$$ [-1;0] Половинного деления -0,2877
    24 $$\ln x-x+1.8=0$$ [2;3] Итераций 2,8459
    25 $$\sqrt[3]{x-4}-\frac{1}{x^2+1}=0$$ [4;6] Ньютона 4,0002
    26 $$e^x-2\cos x=0$$ [0;2] Половинного деления 0,5398
    27 $$\sqrt[3]{x+2}-3x+16=0$$ [4;7] Итераций 6,0000
    28 $$\frac{\pi\sin x}{x}-3\cos x-2=0$$ [1;2] Ньютона 1,5708

    Задание 2. Строки

  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все вхождения первой буквы этого слова (количество пробелов между словами не изменять).
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить количество слов, которые начинаются и заканчиваются одной и той же буквой.
  • В языке используется латинский алфавит. Глагол прошедшего времени получается из глагола настоящего времени изменением порядка следования гласных ( а, о, u, i, е ) на обратный. Согласные остаются на своих местах. Например, глагол padbote преобразуется в pedbota. Задается глагол настоящего времени. Преобразовать его в глагол прошедшего времени и напечатать.
  • Дана строка-предложение из символов латинского алфавита. Вывести самое короткое слово в предложении (если таких слов несколько, то вывести первое из них).
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат ровно три буквы ' А '.
  • Дана строка из символов латинского алфавита. Проверьте правильность расстановки тега <td>: каждому открытому тегу должен соответствовать закрытый </td>.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить длину самого длинного слова.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова, но разделенные одним символом '.' (точка). В конце точку не ставить.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все вхождения последней буквы этого слова (количество пробелов между словами не изменять).
  • Предложение состоит из слов, разделенных одним или несколькими пробелами. Написать программу, печатающую все слова, оканчивающиеся на заданный символ.
  • В предложении, состоящем из слов, разделенных одним пробелом, заменить первую букву у слов, следующих за словами die, der, das, на прописную.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все вхождения заданного символа (количество пробелов между словами не изменять).
  • Дана строка-предложение из символов латинского алфавита. Преобразовать строку так, чтобы каждое слово начиналось с заглавной буквы.
  • Дана строка-предложение из символов латинского алфавита. Вывести самое длинное слово в предложении (если таких слов несколько, то вывести последнее из них).
  • Определить, сколько раз в строке встречается заданное слово.
  • В записке слова зашифрованы – каждое из них записано наоборот. Расшифровать сообщение.
  • Дана строка из восьми цифровых символов. Переведите ее в формат даты "dd-mm-yyyy" и проверьте корректность такой даты.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат введенный символ.
  • Выясните, имеются ли среди введенных символов все буквы, входящие в слово "yandex".
  • Предложение состоит из слов, разделенных одним или несколькими пробелами. Написать программу, печатающую все слова, начинающиеся на введенный символ.
  • В английском предложении слова разделены одним пробелом. Во всех словах, следующих за артиклями а и the, первую букву заменить на прописную. Написать программу, выполняющую эту работу.
  • Написать программу, определяющую, какой процент слов в английском тексте содержит удвоенную согласную.
  • В языке используется латинский алфавит, причастие всегда оканчивается суффиксом "ings". Задана строка слов, в которой слова отделяются одним или несколькими пробелами. Напечатать причастия, имеющиеся в этой строке.
  • Дана строка из малых символов латинского алфавита. Замените каждый символ на следующий за ним по алфавиту, символ 'z' замените на 'a'.
  • Дана строка из символов латинского алфавита. Замените все вхождения строки "two" на символ '2'.
  • Отредактировать заданное предложение, удаляя из него те слова, которые встречаются в предложении заданное число раз.
  • Определите, какой процент от каждого слова составляют входящие в него цифры.
  • Дан текст, состоящий из символов латинского алфавита, пробелов и знаков пунктуации. Найдите самую часто встречающуюся гласную букву (без учета регистра).
  • Задание 3. Одномерный массив: преобразование массива

    Решите задачи данной группы, оформив решение в виде функций генерации, вывода и обработки массивов. Предусмотрите в функции генерации массива ввод границ диапазона случайных чисел.

  • Заменить все положительные элементы целочисленного массива, состоящего из n элементов, на значение минимального.
  • Дан массив, состоящий из n элементов. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой больше k, на один наименьший элемент массива. Если таких серий нет, то массив оставить без изменений.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив первую серию наибольшей длины на один элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Вставить перед каждой серией минимальный элемент массива.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами наибольшую первую и k -ю серии массива. Если таких серий в массиве меньше k, то вывести массив без изменений.
  • Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся менее двух раз.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив перед каждым положительным элементом минимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив каждую его серию на один элемент.
  • Заменить все отрицательные элементы целочисленного массива, состоящего из n элементов, на значение максимального.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Удалить из массива все серии, длина которых меньше k.
  • Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся более двух раз.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив после каждого отрицательного элемента минимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив все серии наибольшей длины на один элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами наименьшую последнюю и k -ю серии массива. Если таких серий в массиве меньше k, то вывести массив без изменений.
  • Заменить все положительные элементы целочисленного массива, состоящего из n элементов, на значение максимального.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Удалить из массива все серии, длина которых больше k. Если таких серий нет, то массив оставить без изменений.
  • Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся ровно два раза.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой равна k, на один элемент, равный сумме наибольшего и наименьшего элементов массива.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив перед каждым отрицательным элементом максимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, уменьшив каждую его серию на один элемент.
  • Даны два массива A и B, состоящие из n элементов каждый, элементы которых упорядочены по убыванию. Объединить эти массивы так, чтобы результирующий массив остался упорядоченным
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Вставить после каждой серии максимальный элемент массива.
  • Заменить все отрицательные элементы целочисленного массива, состоящего из n элементов, на значение минимального.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив после каждого положительного элемента максимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой меньше k, на один наибольший элемент массива.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами первую и последнюю серии наибольшей длины. Если серия с максимальной длиной единственная, то массив не изменять.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Переставить первую серию минимальной длины с последней серией максимальной длины. Если максимальная длина равна минимальной, то меняются первые и последние серии.
  • Задание 4. Одномерный массив: сортировка массива

    Решите задачи данной группы, оформив решение в виде функций генерации, вывода и обработки массивов. Предусмотрите в функции генерации массива ввод границ диапазона случайных чисел.

  • Отсортируйте в массиве нечетные элементы по убыванию.
  • Организуйте массив, содержащий 20 различных случайных целых чисел. После этого элементы массива упорядочиваются по убыванию, и содержимое отсортированного массива выводится на экран.
  • Сортировка подсчетом. Выходной массив заполняется значениями –1. Затем для каждого элемента определяется его место в выходном массиве путем подсчета количества элементов, строго меньших данного. Естественно, что все одинаковые элементы попадают на одну позицию, за которой следует ряд значений –1. После этого оставшиеся в выходном массиве позиции со значением –1 заполняются копией предыдущего значения.
  • Организуйте массив, содержащий 15 различных целых чисел. После этого отдельно первые 5 элементов, вторые 5 элементов и последние 5 элементов сортируются по возрастанию. Содержимое отсортированного таким образом массива выводится на экран.
  • "Хитрая" сортировка. Из массива путем однократного просмотра выбирается последовательность элементов, расположенных в порядке возрастания, переносится в выходной массив и заменяется во входном значением -1. Затем оставшиеся элементы включаются в полученную упорядоченную последовательность методом "погружения", когда очередной элемент путем ряда обменов "погружается" до требуемой позиции в уже упорядоченную часть массива.
  • Дано линейное множество A из N точек. Найти такую точку из данного множества, сумма расстояний от которой до остальных его точек максимальна, и саму эту сумму.
  • Дано линейное множество A из N точек. Найти пару различных точек этого множества с максимальным расстоянием между ними и само это расстояние (точки выводятся в том же порядке, в котором они перечислены при задании множества A ).
  • Организуйте массив, содержащий 2n целых чисел. Отсортируйте элементы с нечётными индексами по возрастанию.
  • Дан массив размера N. Вывести индексы массива в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность.
  • Отсортируйте в массиве четные элементы по возрастанию.
  • Создайте целочисленный массив, содержащий 2n различных чисел. Отсортируйте первую половину массива по возрастанию, а вторую по убыванию. Выведите на экран, отсортированный таким образом массива.
  • Отсортируйте в массиве положительные элементы по возрастанию, отрицательные – по убыванию.
  • Массивы А и В заполнены случайными различными числами, причем в В в 2 раза меньше элементов, чем в А. Определите входят ли все элементы В в А.
  • Дан массив размера N. Вывести индексы массива в том порядке, в котором соответствующие им элементы образуют убывающую последовательность.
  • На координатной прямой дана точка A и множество B из N точек. Найти номер точки из множества B, наиболее близкой от точки A.
  • Организуйте массив, содержащий 2n целых чисел. Отсортируйте элементы с нечётными индексами по убыванию.
  • Дано линейное множество A из N точек. Найти такую точку из данного множества, сумма расстояний от которой до остальных его точек минимальна, и саму эту сумму.
  • Дана точка A и множество B из N точек. Найти номер точки из множества B, наиболее удаленной от точки A.
  • Дано линейное множество A из N точек. Найти пару различных точек этого множества с минимальным расстоянием между ними и само это расстояние (точки выводятся в том же порядке, в котором они перечислены при задании множества A ).
  • Даны множества A и B, состоящие соответственно из N1 и N2 точек. Найти максимальное расстояние между точками этих множеств и сами точки, расположенные на этом расстоянии.
  • В массиве 2 n + 1 различных элементов. Найдите средний элемент массива. Под средним элементом понимают такой, для которого в массиве n элементов больше его и n элементов меньше.
  • Даны линейные множества A и B, состоящие соответственно из N1 и N2 точек. Найти минимальное расстояние между точками этих множеств и сами точки, расположенные на этом расстоянии.
  • В массиве 3n элементов. Отсортируйте первые n элементов массива по убыванию, последние n элементов по возрастанию.
  • Даны два массива А и В. Сформируйте из них массив С, в котором элементы отсортированы по убыванию.
  • Дан целочисленный массив А. Отсортируйте по возрастанию те его элементы, которые входят во введенный отрезок $$[a, b]$$.
  • Дано линейное множество A из N точек. Найти такую точку из данного множества, которая наиболее близка к значению среднего арифметического элементов массива.
  • Дан массив А, состоящий из 2N элементов. Разбейте его на массивы В и С по N элементов каждый так, чтобы каждый элемент В не превосходил каждого элемента С.
  • Дан массив А, состоящий из N целых чисел. Сформируйте массив В, состоящий из убывающей последовательности различных элементов массива А.
  • Задание 5. Двумерный массив

    Решите задачи данной группы, оформив решение в виде функций генерации, вывода и обработки массивов. Предусмотрите в функции генерации массива ввод границ диапазона случайных чисел.

  • Дана квадратная матрица порядка $$2n + 1$$. Зеркально отразить ее элементы относительно горизонтальной оси симметрии матрицы.
  • Даны действительные числа $$a_1, \ldots, а_{64}$$. Получить действительную квадратную матрицу порядка 8, элементами которой являются числа $$a_1, \ldots, а_{64}$$, расположенные в ней по схеме, которая приведена на рисунке.
  • Дана матрица размера $$n \times m$$. Поменять местами ее столбцы так, чтобы их максимальные элементы образовывали убывающую последовательность.
  • Найдите квадратную матрицу, обратную данной с размером $$n \times n$$.
  • Дана квадратная матрица порядка $$2n$$. Повернуть ее на 180 градусов в положительном направлении.
  • Заполнить двумерный квадратный массив целыми числами от 1 до 100 по спирали, как показано на следующем рисунке.
  • Даны действительные числа $$a_1, \ldots, а_{64}$$. Получить действительную квадратную матрицу порядка 8, элементами которой являются числа $$a_1, \ldots, а_{64}$$, расположенные в ней по схеме, которая приведена на рисунке.
  • Дана матрица размера $$n \times m$$. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы.
  • Даны две матрицы $$n \times m$$ и $$m \times k$$. Получите их произведение.
  • Дана матрица размера $$n \times m$$. Поменять местами ее строки так, чтобы их максимальные элементы образовывали возрастающую последовательность.
  • В данной действительной квадратной матрице порядка $$n$$ найти наибольший по модулю элемент. Получить квадратную матрицу порядка $$n – 1$$ путем выбрасывания из исходной матрицы какой-нибудь строки и столбца, на пересечении которых расположен элемент с найденным значением. Выполняйте до тех пор, пока не останется последний элемент.
  • Дана квадратная матрица порядка $$2n+1$$. Зеркально отразить ее элементы относительно побочной диагонали матрицы.
  • Дана действительная квадратная матрица порядка $$2n+1$$. Получить новую матрицу, повернув ее блоки, ограниченные диагоналями, на 180 градусов.
  • Дана матрица размера $$n \times m$$. Поменять местами ее первый и последний строки, содержащие только отрицательные элементы.
  • Дана целочисленная матрица размера $$n \times m$$. Найти элемент, являющийся максимальным в своей строке и минимальным в своем столбце. Если такой элемент отсутствует, то вывести 0.
  • Составьте программу циклической перестановки столбцов двумерного массива $$m \times k$$, при которой смещение происходит вправо на n столбцов.
  • Даны действительные числа $$a_1, \ldots, а_{64}$$. Получить действительную квадратную матрицу порядка 8, элементами которой являются числа $$a_1, \ldots, а_{64}$$, расположенные в ней по схеме, которая приведена на рисунке.
  • Дана матрица размера $$n \times m$$. Поменять местами ее столбцы так, чтобы их минимальные элементы образовывали возрастающую последовательность.
  • Дана квадратная матрица порядка $$2n + 1$$. Зеркально отразить ее элементы относительно вертикальной оси симметрии матрицы.
  • Дана квадратная матрица порядка $$2n$$. Повернуть ее на 270 градусов в положительном направлении относительно ее центра.
  • Дана матрица размера $$n \times m$$. Поменять местами строки, содержащие минимальный и максимальный элементы матрицы.
  • В квадратной таблице обменяйте местами элементы строки и столбца, на пересечении которых находится минимальный из положительных элементов.
  • Дана квадратная матрица порядка $$2n$$. Повернуть ее на 90 градусов в положительном направлении относительно ее центра.
  • Дана квадратная матрица порядка $$2n + 1$$. Зеркально отразить ее элементы относительно главной диагонали матрицы.
  • Составьте программу циклической перестановки строк двумерного массива $$m \times k$$, при которой смещение происходит вниз на $$n строк$$.
  • Дана матрица размера $$n \times m$$. Поменять местами ее первый и последний столбцы, содержащие только положительные элементы.
  • Заполнить двумерный квадратный массив целыми числами от 1 до 100 по спирали, начиная от центра и закручивая по часовой стрелке.
  • Заполните квадратную матрицу $$n \times n$$ по принципу латинского квадрата: в каждой строке и каждом столбце используются неповторяющиеся между собой числа от 1 до $$n$$.
  • Задание 6. Файлы

    Организуйте работу с текстовым файлом. Исходные файлы не предполагают изменения. Измененные данные сохраните в другом файле.

  • Даны два текстовых файла с именами Name1 и Name2. Добавить в конец каждой строки файла Name1 соответствующую строку файла Name2. Если файл Name2 короче файла Name1, то выполните переход к началу файла Name2.
  • Организовать текстовый файл, состоящий из N строк. Определить максимальный и минимальный размер строки в файле и вывести их в другой файл.
  • Дан текстовый файл с именем NameT. Подсчитать число повторений в нем строчных русских букв ( 'а' – 'я' ) и создать файл с именем NameS, строки которого имеют вид: " <буква> – <число повторений данной буквы> ". Буквы, отсутствующие в тексте, в файл не включать. Строки упорядочить по убыванию числа повторений букв, а при равном числе повторений – по возрастанию кодов букв.
  • Дан символ 'C' (прописная латинская буква) и текстовый файл. Создать строковый файл, содержащий все слова из исходного файла, начинающиеся этой буквой (как прописной, так и строчной). Знаки препинания, расположенные в начале и в конце слов, не учитывать. Если исходный файл не содержит подходящих слов, оставить результирующий файл пустым.
  • В отсортированный файл фамилий добавить новую фамилию, не нарушив его упорядоченность.
  • Дан текстовый файл. Создать файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке возрастания их кодов.
  • Организовать текстовый файл f состоящий из N строк. После этого организовать файлы h и g. В файл h записать строки файла f занимающие нечётные позиции, в файл g чётные.
  • Дан текстовый файл f. Создать файл g, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке следования в исходном файле.
  • Дано целое число N и текстовый файл с именем Name1, содержащий один абзац текста, выровненный по левому краю. Отформатировать текст так, чтобы его ширина не превосходила N позиций, и выровнять текст по левому краю. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле с именем Name2.
  • Организовать текстовый файл f, состоящий из N строк. Организовать замену символов в файле. "Старый" символ и "новый" символ запрашиваются и вводятся с клавиатуры. Изменение вывести в другой файл.
  • Дан текстовый файл. Вывести в другой файл самые длинные слова текста (с учетом знаков препинания, расположенных в начале и в конце слов).
  • Добавить в указанное место файла заданное количество строк, начиная с указанного места другого файла. Место задается номером строки. Результат вывести в третий файл.
  • В файле хранятся названия товаров и цены в рублях 1997 г. Создать новый файл, преобразовав цены товара в рубли и копейки 1998 г., добавив наименование "руб." и "коп.". В указанный год цены уменьшились в 1000 раз.
  • Удалить заданное количество строк из указанного места файла. Изменения вывести в другой файл. Если действие невозможно, вывести об этом сообщение на экран и в выходной файл
  • Организовать текстовый файл f, состоящий из N строк. После этого создать текстовый файл g, содержащий строки текстового файла f в обратном порядке.
  • Дан файл, содержащий текст, выровненный по левому краю (длина каждой строки не превышает 50 символов). Выровнять его по правому краю, добавив в начало каждой непустой строки необходимое количество пробелов. Выровненный текст записать в другой файл.
  • Организовать текстовый файл, состоящий из N строк. Вывести на экран и в другой файл строки, размер которых больше среднего размера строки в файле.
  • Дан текстовый файл. Создать файл, содержащий все знаки препинания, встретившиеся в текстовом файле (в том же порядке).
  • Организовать текстовый файл, состоящий из N строк. Заменить в файле все маленькие латинские буквы на большие и вывести это в другой файл.
  • Дан текстовый файл. Вывести в другой файл самые короткие слова текста (с учетом знаков препинания, расположенных в конце слов). Короткое слово не является пустым.
  • Организовать текстовый файл, состоящий из N строк. Заменить в нем все строки данной длины новой строкой. Длину заменяемых строк и содержимое новой строки запрашивается и вводится с клавиатуры. Если таких строк нет, то данные не изменять. Изменение вывести в новый файл.
  • Дано число N и текстовый файл. Удалить из файла строки с номерами, кратными N. Пустые строки не учитывать и не удалять. Если строки с требуемыми номерами отсутствует, то оставить файл без изменений. Изменение вывести в другой файл.
  • Дан текстовый файл, содержащий текст, выровненный по левому краю (длина каждой строки не превышает 50 символов). Выровнять его по центру, добавив в начало каждой непустой строки необходимое количество пробелов. Строки нечетной длины перед центрированием дополнять слева пробелом. Выровненный текст записать в другой файл.
  • Организовать текстовый файл, состоящий из N строк. Преобразовать файл, удалив в каждой его строке лишние пробелы. Изменения вывести в другой файл.
  • Дан файл с текстом из символов латинского алфавита. Зашифровать файл, выполнив циклический сдвиг каждой буквы вперед на n позиций в алфавите. Знаки препинания и пробелы не изменять.
  • Даны числа N1, N2 и текстовый файл. Удалить из файла строки с номерами, заключенными между N1, N2, не включая границ. Изменения вывести в другой файл. Если выполнить удаление невозможно, выдайте об этом сообщение на экран и в выходной файл.
  • Дан файл с текстом из символов латинского алфавита, цифр и знаков. Замените все цифры их названиями на английском языке. Изменения вывести в другой файл.
  • Организовать текстовый файл f состоящий из N строк. После этого организовать файлы h и g. В файл h записать строки файла f нечётной длины, в файл g чётной длины.
  • Задание 7. Динамические массивы

    Решите задачи данной группы, выполняя следующие требования:

  • Сформировать динамический двумерный массив, заполнить его случайными числами и вывести на экран.
  • Выполнить указанное в варианте задание и вывести полученный массив на экран.
  • Варианты задания

    Вид преобразования массива
    1 Добавить строку с заданным номером.
    2 Добавить столбец с заданным номером.
    3 Добавить строку в конец матрицы.
    4 Добавить столбец в конец матрицы.
    5 Добавить строку в начало матрицы.
    6 Добавить столбец в начало матрицы.
    7 Добавить К строк в конец матрицы.
    8 Добавить К столбцов в конец матрицы.
    9 Добавить К строк в начало матрицы.
    10 Добавить К столбцов в начало матрицы.
    11 Удалить строку с номером К.
    12 Удалить столбец с номером К.
    13 Удалить строки, начиная со строки К1 и до строки К2.
    14 Удалить столбцы, начиная со столбца К1 и до столбца К2.
    15 Удалить все четные строки.
    16 Удалить все четные столбцы.
    17 Удалить все строки, в которых есть хотя бы один нулевой элемент.
    18 Удалить все столбцы, в которых есть хотя бы один нулевой элемент.
    19 Удалить строку, в которой находится наибольший элемент матрицы.
    20 Добавить строки после каждой четной строки матрицы.
    21 Добавить столбцы после каждого четного столбца матрицы.
    22 Добавить К строк, начиная со строки с номером N.
    23 Добавить К столбцов, начиная со столбца с номером N.
    24 Добавить строку после строки, содержащей наибольший элемент.
    25 Добавить столбец после столбца, содержащего наибольший элемент.
    26 Добавить строку после строки, содержащей наименьший элемент.
    27 Добавить столбец после столбца, содержащего наименьший элемент.
    28 Удалить строку и столбец, на пересечении которых находится наибольший элемент массива.

    Задание 8. Динамические структуры

    Решите задачи данной группы, выполняя следующие требования:

  • Сформировать идеально сбалансированное бинарное дерево, тип информационного поля указан в варианте.
  • Распечатать полученное дерево.
  • Выполнить обработку дерева в соответствии с заданием, вывести полученный результат.
  • Преобразовать идеально сбалансированное дерево в дерево поиска.
  • Распечатать полученное дерево.
  • Варианты задания

    Тип информационного поля Критерии поиска
    1 $$char$$ Найти количество элементов с заданным ключом.
    2 $$int$$ Найти максимальный элемент в дереве.
    3 $$char*$$ Найти количество листьев в дереве.
    4 $$double$$ Найти минимальный элемент в дереве.
    5 $$char$$ Найти высоту дерева.
    6 $$int$$ Найти среднее арифметическое элементов дерева.
    7 $$char*$$ Найти количество элементов дерева, начинающихся с заданного символа.
    8 $$char$$ Найти количество элементов с заданным ключом.
    9 $$double$$ Найти максимальный элемент в дереве.
    10 $$int$$ Найти количество листьев в дереве.
    11 $$double$$ Найти минимальный элемент в дереве.
    12 $$char$$ Найти высоту дерева.
    13 $$int$$ Найти среднее арифметическое элементов дерева.
    14 $$char$$ Найти количество элементов с заданным ключом.
    15 $$char*$$ Найти количество элементов дерева, начинающихся с заданного символа
    16 $$int$$ Найти максимальный элемент в дереве.
    17 $$double$$ Найти количество листьев в дереве.
    18 $$int$$ Найти минимальный элемент в дереве.
    19 $$char$$ Найти высоту дерева.
    20 $$double$$ Найти среднее арифметическое элементов дерева.
    21 $$char*$$ Найти количество элементов дерева, начинающихся с заданного символа.
    22 $$char$$ Найти количество элементов с заданным ключом.
    23 $$char$$ Найти количество листьев в дереве.
    24 $$double$$ Найти максимальный элемент в дереве.
    25 $$double$$ Найти минимальный элемент в дереве.
    26 $$char$$ Найти высоту дерева.
    27 $$float$$ Найти среднее арифметическое элементов дерева.
    28 $$int$$ Найти количество элементов с заданным ключом.

    Задание 9. Рекурсивные алгоритмы

    Разработайте рекурсивный алгоритм для решения задачи.

    1-10. Определите закономерность формирования членов последовательности. Найдите $$N$$ -ый член последовательности, сократив количество рекурсивных вызовов.

  • $$1, 1, 2, 3, 5, \ldots$$
  • $$1, 2, 2, 4, 8, \ldots$$
  • $$1, 1, \frac12, \frac23, \frac67, \ldots$$
  • $$1,2,\frac12,4,\frac18,\ldots$$
  • $$1,1,\sqrt{2},\sqrt{1+\sqrt{2}},\sqrt{\sqrt{2}+\sqrt{1+\sqrt{2}}},\ldots$$
  • $$1, 1, 2, 5, 29, \ldots$$
  • $$1,2,\frac32,\frac74,\frac{13}{8},\ldots$$
  • $$1, 1, 2, 9, 737, \ldots$$
  • $$1,2,\sqrt{2},\sqrt[4]{8},\sqrt[8]{32},\ldots$$
  • $$1,2,\frac{1}{\sqrt{2}},2\sqrt[4]{2},\frac{1}{\sqrt{4\sqrt[4]{2}}},\ldots$$
  • 11-20. Найдите значение функции для любых целых неотрицательных аргументов.

  • $$F(n,m)= \begin{cases} 1,\text{ если }n=0,\\ -1,\text{ если }n<m,\\ 2F(n-1,m)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} 1,\text{ если }n=2,\\ m,\text{ если }n-\text{нечетно},\\ F\left(\frac{n}{2}+1,m+n\right)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} m,\text{ если }n=0,\\ n,\text{ если }m=0,\\ F(n-1,m)+F(n,m-1)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} \frac{n}{2},\text{ если }n-\text{четно},\\ m,\text{ если }n=1,\\ F\left(\frac{n+1}{2},m+1\right)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} \min(n,m),\text{ если }(n+m)-\text{нечетно},\\ F\left(\frac{n+m}{2},m\right)+F\left(n,\frac{n+m}{2}\right)\text{ в остальных случаях}. \end{cases} $$
  • $$F(m,n)= \begin{cases} F(0,n)=n+1,\\ F(m,0)=F(m-1,1),\text{ если }m>0,\\ F(m,n)=F(m-1,F(m,n-1))\text{ если }m,n>0. \end{cases} $$
  • $$F(n,m)= \begin{cases} \max(n,m),\text{ если }(n+m)-\text{четна}\\ F\left(\frac{n+m+1}{2},m\right)+F\left(n,\frac{n+m+1}{2}\right)\text{ в остальных случаях }. \end{cases} $$
  • $$F(n,m)= \begin{cases} \min(n+m,m\cdot n),\text{ если }(n\cdot m)-\text{нечетно}\\ F\left(\frac{n\cdot m}{2},m\right)+F\left(n,\frac{n\cdot m}{2}\right)\text{ в остальных случаях }. \end{cases} $$
  • $$F(m,n)= \begin{cases} n+2,\text{ если } m=0,\\ F(m-1,1),\text{ если } n=0,m>0,\\ F(m-1,F(m,n-1))\text{ в остальных случаях }. \end{cases} $$
  • $$F(m,n)= \begin{cases} n+1,\text{ если } m=0,\text{ или } n=0,\\ F(m-1,F(m,n-1))\text{ в остальных случаях }. \end{cases} $$
  • 21-28. Составьте рекурсивную функцию для решения задачи.

  • Найдите сумму всех трехзначных чисел, кратных 25.
  • Переведите натуральное число $$N$$ в восьмеричную систему счисления.
  • Найдите $$n$$ -ый член геометрической прогрессии, заданной первым членом и знаменателем.
  • Найдите сумму первых $$n$$ четных натуральных чисел
  • Найдите $$n$$ -ый член арифметической прогрессии, заданной первым членом и разностью.
  • Найдите сумму первых $$n$$ натуральных чисел, оканчивающихся цифрой 5.
  • Функция определена на полуинтервале $$[0; 2)$$ следующим образом: $$f(x)=\sqrt{4-x^2}.$$ Выполните ее периодическое продолжение на множество действительных чисел. Найдите значение полученной функции для данного $$x$$.
  • Переведите натуральное число $$N$$ в двоичную систему счисления.
  • Задание 10. Алгоритмы обработки данных

    1. Закраска прямой. На числовой прямой окрасили $$N$$ отрезков. Известны координаты левого и правого концов каждого отрезка ( $$L_i$$ и $$R_i$$ ). Найти длину окрашенной части числовой прямой.

    Ограничения: $$L_i$$ и $$R_i$$ – целые, $$-1 000 000 000 \leq L_i \leq R_i \leq 1 000 000 000$$, $$1 \leq N \leq 15 000$$, время 1 с.

    Ввод из файла cover.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – пары $$L_i$$ и $$R_i$$.

    Вывод в файл cover.out. Вывести одно число – длину окрашенной части прямой.

    Примеры

    2. Сумма произведений. Дан набор переменных $$х_1, х_2, \ldots , x_N$$. Каждая переменная $$х_i$$ может принимать значение только -1, 0 или +1. Для данного целого числа $$S$$ требуется определить количество способов присвоить переменным $$х_i$$ значения так, чтобы сумма всех возможных произведений $$хi хj$$ была равна $$S$$, где $$i < j$$ и $$i, j = 1, 2, \ldots, N$$. Два способа считаются различными, если они содержат различное число $$х_i = 0$$.

    Ограничения: $$2 \leq N \leq 10 000$$, $$-10 000 \leq S \leq 10 000$$, время 1 с.

    Ввод из файла prodsum.in. В первой строке находятся числа $$N$$ и $$S$$, разделенные пробелом.

    Вывод в файл prodsum.out. Вывести одно целое число – количество способов представить $$S$$ как сумму произведений.

    Примеры

    3. Статическая сложность. Анализ временной сложности алгоритмов – важный инструмент создания эффективных программ. Алгоритмы, выполняемые за линейное время, как правило, значительно быстрее алгоритмов, требующих для выполнения той же задачи квадратичного времени, так что предпочтение должно быть отдано первым.

    Обычно определяют время выполнения алгоритма по отношению к $$n$$ – "размеру" входных данных. Это может быть число объектов, которые нужно отсортировать, число точек многоугольника и т.п. Поскольку определение формулы зависимости временной сложности алгоритма от $$n$$ – непростая задача, было бы замечательно, если бы ее можно было автоматизировать. К сожалению, в общем случае это невозможно. Но в этой задаче мы будем рассматривать программы очень простой природы, над которыми это можно проделать. Рассматриваемые программы записаны согласно следующим правилам БНФ, где <число> может быть любым неотрицательным целым числом:

    <Программа> : := "BEGIN" <Список операторов> "END" 
    <Список операторов>::=<Оператор>|<Оператор><Список операторов> 
    <Оператор> ::=<Оператор LOOP> | <Оператор 0P> 
    <Оператор LOOP> ::=<Заголовок ЮОР><Список операторов>"END" 
    <Заголовок LOOP> : := "LOOP" <число> | "LOOP n" 
    <Оператор OP> : := "OP" <число>

    Время выполнения такой программы может быть вычислено следующим образом: выполнение оператора ОР требует столько единиц времени, сколько указано в его параметре. Список операторов, заключенный в оператор LOOP, выполняется столько раз, сколько указано в параметре оператора, то есть или заданное константное число раз, если задано число, или $$n$$ раз, если параметром является $$n$$. Время выполнения списка операторов равно сумме времени выполнения его частей. Таким образом, время выполнения программы в целом зависит от $$n$$.

    Ввод из файла icomplex.in. В первой строке находится целое число $$k$$ — число программ во входном файле. Затем идут $$k$$ программ, удовлетворяющих приведенной грамматике. Пробелы и переводы строк могут встречаться везде в программе, но не в ключевых словах BEGIN, END, LOOP и OP, нет их и в целых числах.

    Вывод в файл icomplex.out Для каждой программы сначала идет строка с номером программы. В следующей строке записывается время работы программы в терминах $$n$$ – многочлен степени не более 10. Многочлен должен быть записан обычным способом, то есть подобные слагаемые должны быть приведены, слагаемое большей степени должно предшествовать слагаемому меньшей степени, слагаемые с коэффициентом 0 не записываются, множители 1 не записываются. Общий вид второй строки " Runtime = a*n^10+b*n^9+...+i*n^2+j*n+k ". Если время выполнения нулевое, нужно вывести " Runtime = 0 ". За строкой с многочленом должна следовать пустая строка.

    Ограничения: вложенность операторов LOOP не превышает 10, размер входного файла не более 2 Кбайт, коэффициенты многочлена в ответе не превышают 50 000, время 1 с.

    Пример

    4. Строки Фибоначчи. Строку Фибоначчи $$F(K)$$ для натуральных чисел $$K$$ определим так: $$F(1) ='A', F(2) ='В', F(K) = F(K – 1) + F(K – 2)$$ при $$K > 2$$, где "+" означает конкатенацию строк. Требуется найти количество вхождений строки $$S$$, состоящей из символов $$А$$ и $$В$$, в строку Фибоначчи $$F(N)$$.

    Ограничения: Длина строки $$S$$ составляет от 1 до 25 символов, $$1 \leq N \leq 45$$, время 1 с.

    Примечание. Длина $$F(45)$$ равна 1 134 903 170.

    Ввод из файла fibostr.in. В первой строке содержится число $$N$$, во второй – строка $$S$$.

    Вывод в файл fibostr.out. Вывести одно число – количество вхождений строки $$S$$ в строку Фибоначчи $$F(N)$$.

    Примеры

    5. Анти-QuickSort. Для сортировки последовательности чисел широко используется быстрая сортировка – QuickSort. Оценивать время работы алгоритма будем количеством сравнений с элементами массива (то есть суммарным количеством сравнений в первом и втором while ). Требуется написать программу, генерирующую тест, на котором быстрая сортировка сделает наибольшее число таких сравнений.

    Ввод из файла antiqs.in. В первой строке находится единственное число $$N$$.

    Ограничения: $$1 \leq N \leq 70 000$$, время 1 с.

    Вывод в файл antiqs.out. Вывести перестановку чисел от 1 до $$N$$, на которой быстрая сортировка выполнит максимальное число сравнений. Если таких перестановок несколько, вывести любую из них.

    Пример

    6. Путь коня. Дана шахматная доска, состоящая из $$N\times N$$ клеток; несколько из них вырезано. Провести ходом коня через невырезанные клетки путь минимальной длины из одной заданной клетки в другую.

    Ограничения: $$2 \leq N \leq 50$$, время 1 с.

    Ввод из файла knightw.in. В первой строке задано число $$N$$. В следующих $$N$$ строках содержится по $$N$$ символов. Символом # обозначена вырезанная клетка, точкой – невырезанная клетка, @ — заданные клетки (таких символов два).

    Вывод в файл knightw.out. Если путь построить невозможно, вывести "Impossible", в противном случае вывести такую же карту, как и на входе, но пометить все промежуточные положения коня символом @.

    Примеры

    7. Грядки. Прямоугольный садовый участок шириной $$N$$ и длиной $$М$$ метров разбит на квадраты со стороной 1 м. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям:

  • из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону;
  • никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается).
  • Подсчитайте количество грядок на садовом участке.

    Ограничения: $$1 \leq N, M \leq 200$$, время 1 с.

    Ввод из файла beds.in. В первой строке находятся числа $$N$$ и $$М$$ через пробел, далее идут $$N$$ строк по $$М$$ символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов в исходном файле нет.

    Вывод в файл beds.out. Вывести одно число – количество грядок на садовом участке.

    Пример

    8. Упорядоченные дроби. Вывести в порядке возрастания все несократимые дроби, заключенные между 0 и 1, знаменатели которых не превышают $$N$$.

    Ограничения: $$2 \leq N \leq 255$$, время 1 с.

    Ввод из файла ordfrac.in. В первой строке находится единственное число $$N$$.

    Вывод в файл ordfrac.out. В каждой строке выводится дробь.

    Пример

    9. Сообщение. В сообщении, состоящем из одних русских букв и пробелов, каждую букву заменили ее порядковым номером в русском алфавите (А – 1, Б – 2, ... , Я – 33), а пробел – нулем. Требуется по заданной последовательности цифр найти количество исходных сообщений, из которых она могла получиться.

    Ограничения: цифр не более 100, время 1 с.

    Ввод из файла message.in. В первой строке содержится последовательность цифр.

    Вывод в файл message.out. Вывести одно число.

    Пример

    10. Умножение многочленов. Ввести в символьной форме два многочлена от х с целыми коэффициентами и вывести их произведение в порядке убывания степеней – также в символьной форме.

    Ограничения: степень исходных многочленов не более 10, коэффициенты исходных многочленов по модулю не более 104, время 1 с.

    Ввод из файла polymul.in. В двух строках находятся многочлены.

    Вывод в файл polymul.out. В единственной строке выводится многочлен.

    Примеры

    11. Гомер Симпсон. Обеденный перерыв Гомера Симпсона составляет $$T$$ мс. Один гамбургер Гомер съедает за $$N$$ мс, один чизбургер — за $$M$$. Требуется найти максимальное суммарное число гамбургеров и чизбургеров, которые Гомер может съесть в течение обеденного перерыва.

    Ограничения: $$1 \leq M, N, T \leq 1 000 000$$, все числа целые, время 2 с.

    Ввод из файла homer.in. В первой строке находятся три числа – $$M$$, $$N$$ и $$T$$, разделенные пробелами.

    Вывод в файл homer.out. Вывести максимальное суммарное число гамбургеров и чизбургеров. Если остается какое-то время, требуется указать его через пробел. Предпочтителен вариант, когда дополнительного времени остается как можно меньше.

    Примеры

    12. Диалог компьютеров. Три компьютера соединены сетью. Один из них – сервер, два других – клиенты. На сервере есть несколько файлов. Полные имена файлов, состоящие из двух частей (имя и расширение), различны. Оба клиента знают полные имена всех файлов, находящихся на сервере. Сервер выбирает один из своих файлов и посылает его имя одному из клиентов, а расширение – второму.

    Затем клиенты начинают общаться друг с другом, пытаясь определить, какой файл был выбран сервером (они хотят узнать полное имя файла). Однако клиенты вынуждены общаться очень ограниченным способом. Они по очереди посылают сообщения друг другу, но могут сказать только, что не знают полного имени файла. Если клиент не знает полного имени выбранного файла, он может послать другому клиенту сообщение, говорящее: "Я не знаю полного имени файла". Клиенты чередуются, посылая только это сообщение туда и обратно. Так продолжается до тех пор, пока один из клиентов не узнает полное имя файла или они не решат закончить диалог. Клиент, получивший первую часть полного имени файла, всегда ждет, что второй клиент пошлет первое сообщение.

    Пусть вы знаете все полные имена файлов, находящихся на сервере, и слушаете разговор клиентов. Основываясь на этой беседе, вы должны определить набор файлов, которые могли быть выбраны сервером. Файлы в этом наборе называются файлами-кандидатами.

    Ввод из файла dialogue.in. В первой строке находятся два целых числа, $$N$$ и $$M$$, разделенные пробелом: $$N$$ – число файлов на сервере, $$М$$ – число сообщений, посланных клиентами, пытающимися определить полное имя файла.

    Каждая из следующих $$N$$ строк содержит одно полное имя файла. Полное имя файла дано в стиле, аналогичном формату 8.3 MS-DOS. Каждое полное имя представлено в форме имя.расширение, где и имя, и расширение состоят только из заглавных латинских букв и цифр. Имя всегда имеет от одного до восьми символов. Расширение имеет до трех символов и может быть пусто. Если расширение пусто, разделяющая точка может быть опущена.

    Каждое полное имя файла появляется во входном файле не более одного раза.

    Ограничения: $$1 \leq N \leq 1000, 1 \leq M \leq 100$$, время 3 с.

    Вывод в файл dialogue.out. В первой строке выводится число файлов-кандидатов для данных набора файлов и числа сообщений между клиентами. Выводится 0, если файлы-кандидаты отсутствуют.

    В следующих строках находятся полные имена файлов-кандидатов, каждое в отдельной строке. Они должны идти в том же порядке и в том же написании, что и во входном файле. Это означает, что если разделяющая точка в названии конкретного файла была опущена во входном файле, то она должна быть опущена и в выводе, и наоборот. Файл нельзя упоминать более одного раза.

    Пример

    13. Бросание кубика. Кубик, грани которого помечены цифрами от 1 до 6, бросают $$N$$ раз. Найти вероятность того, что сумма выпавших чисел будет равна $$Q$$.

    Ограничения: $$1 \leq N \leq 500, 1 \leq Q \leq 3000$$, время 1 с.

    Ввод из файла die.in. В первой строке находятся числа $$N$$ и $$Q$$ через пробел.

    Вывод в файл die.out. Выводится единственное вещественное число, которое должно отличаться от истинного значения не более чем на 0,01 истинного значения.

    Примеры

    14. Ближайшее число. Дана матрица $$A$$ размером $$N\times N$$, заполненная неотрицательными целыми числами. Расстояние между двумя элементами $$A_{ij}$$ и $$A_{pq}$$ определено как $$|i – p| + |j – q|$$. Требуется заменить каждый нулевой элемент матрицы ближайшим ненулевым. Если есть две или больше ближайших ненулевых ячейки, нуль должен быть оставлен.

    Ограничения: $$1 \leq N \leq 200, 0 \leq A_{ij} \leq 1 000 000$$, время 3 с.

    Ввод из файла neamum.in. В первой строке содержится число $$N$$. Затем идут $$N$$ строк по $$N$$ чисел, разделенных пробелами и представляющих собой матрицу.

    Вывод в файл neamum.out. Выводится $$N$$ строк по $$N$$ чисел, разделенных пробелами, – модифицированная матрица.

    Пример

    15. Прямоугольное деление. Дано $$N$$ прямоугольников со сторонами, параллельными осям координат. Требуется определить, на сколько частей эти прямоугольники разбивают плоскость (внутри частей не должно быть границ прямоугольников).

    Ввод из файла rectpart.in. В первой строке содержится число прямоугольников $$N$$. Далее идут $$N$$ строк, содержащих по четыре числа, $$x_1 y_1 x_2, y_2$$, – координаты двух противоположных углов прямоугольника.

    Ограничения: $$1 \leq N \leq 100$$, координаты представляют собой целые числа и по абсолютной величине не превосходят 10 000, время 3 с.

    Вывод в файл rectpart.out Вывести одно число – количество частей, на которые разбивается плоскость.

    Пример

    16. Водопровод. Город Восточный постоянно страдает от недостатка воды. Для устранения этой проблемы была построена новая водопроводная труба. Строительство трубы началось с обоих концов одновременно, и спустя некоторое время половины соединились. Ну, почти. Первая половина трубы заканчивалась в точке $$(х_1, у_1)$$, а вторая – в точке $$(x_2, у_2)$$. К сожалению, осталось лишь несколько отрезков трубы различной длины. Более того, из-за специфики местной технологии трубы могут быть проложены только в направлении с севера на юг или с востока на запад и соединяются, образуя или прямую, или угол 90 $$\deg$$. Требуется, зная длины отрезков труб $$L_1, L_2, \ldots, L_K$$ и количество отрезков каждой длины $$C_1, C_2, \ldots, C_K$$, сконструировать трубу, соединяющую две заданные точки, или определить, что это невозможно.

    Ограничения: $$1 \leq K \leq 4, 1 \leq x_1, y_1, x_2, y_2, Li \leq 1000, 1 \leq C_i \leq 10$$, все числа целые, время 3 с.

    Ввод из файла wpipe.in. В первой строке находятся числа $$x_1, y_1, x_2, y_2, K$$, затем $$2K$$ чисел: $$L_1, L_2, \ldots, L_K , C_1, C_2, \ldots, C_K$$.

    Вывод в файл wpipe.out. Вывести одно число — минимальное количество нужных отрезков труб или -1, если соединение невозможно.

    17. Химические реакции. Билл преподает химию в школе, он подготовил несколько тестов для учеников. Каждый тест состоит из химической формулы и нескольких возможных результатов реакции. Среди этих результатов ученики должны выбрать правильный. Билл хочет убедиться в том, что, вводя свои тесты в компьютер, он не допустил опечаток, благодаря которым ученики могли бы отбросить неверные ответы, просто подсчитав число химических элементов в левой и правой частях уравнения (в правильном уравнении химической реакции должно соблюдаться равенство).

    Ваша задача - написать программу, которая поможет Биллу. Программа должна прочитать описание теста, состоящее из заданной левой части уравнения и нескольких возможных правых частей, и определить, равно ли количество химических элементов в каждой предложенной правой части уравнения количеству химических элементов в заданной левой части.

    Билл формализовал задачу. И левая, и правая части уравнения представлены строкой символов без пробелов, состоящей из одной или более химических последовательностей, разделенных знаком плюс. Каждая последовательность имеет необязательный предшествующий целый множитель, относящийся ко всей последовательности, и несколько элементов. Каждый элемент может сопровождаться необязательным целым множителем, относящимся к нему. Элемент в этом уравнении может быть или отдельным химическим элементом, или целой последовательностью в круглых скобках. Каждый отдельный химический элемент представлен или одной прописной буквой, или прописной буквой, сопровождаемой строчной.

    Еще более формально, используя нотацию, аналогичную форме Бэкуса-Наура, можно написать:

    <формула>::=[<число>]<последовательность>{"+"[<число>]<последовательность>}
    <последовательность>::=<элемент>[<число>]{<элемент>[<число>]} 
    <элемент>::=<химический элемент>|"("<последовательность>")" 
    <химический элемент>::=<прописная буква>[<строчная буква>] 
    <прописная 6уква>::= "А".."Z" 
    <строчная буква>::= "а".."z" 
    <число>::= "1". ."9" {"0". ."9"}

    Будем говорить, что каждый отдельный химический элемент встречается в формуле всего $$X$$ раз, если $$X$$ – сумма всех различных вхождений этого химического элемента, умноженных на все числа, относящиеся к ним. Например, в формуле

    C2H5OH+3O2+3(SiO2)
  • C встречается всего 2 раза;
  • H встречается всего 6 раз (5 + 1);
  • 0 встречается всего 13 раз (1 + 3 * 2 +3 * 2);
  • Si встречается всего 3 раза.
  • Все множители в формулах – целые числа не меньше 2, если заданы явно, или равны 1 – по умолчанию.

    Ввод из файла chem.in. В первой строке находится формула — левая часть уравнения, во второй – одно число $$N$$ – количество рассматриваемых правых частей, в каждой из следующих $$N$$ строк – одна формула – предлагаемая правая часть уравнения.

    Ограничения: $$1 \leq N \leq 10$$, длина формулы не превосходит 100 символов, каждый

    Вывод в файл chem.out. Для каждой из $$N$$ заданных правых частей выведите одну строку вида

    <формула левой части>!=<формула правой части>

    Здесь <формула левой части> должна быть замещена посимвольной копией формулы левой части, как она дана в первой строке входного файла, а <формула правой части> – замещена точной копией формулы правой части, как она дана во входном файле. В строках не должно быть пробелов.

    Пример

    18. Суммы. Дано $$N$$ целых чисел $$A_1, A_2,\ldots, A_N$$. Требуется найти количество различных значений сумм вида $$k_{1A1} + k_{2A2} + k_NA_N$$.

    Ограничения: $$1 \leq N \leq 500, 0 \leq A_i \leq 100, 0 \leq k_i \leq 1$$, все числа целые, время 2 с.

    Ввод из файла sums.in. В первой строке находится число $$N$$, во второй – $$A_1, A_2,\ldots, A_N$$.через пробел.

    Вывод в файл sums.out. Вывести одно число – количество различных значений сумм.

    Примеры

    19. Lines. В таблице из $$N$$ строк и $$N$$ столбцов некоторые клетки заняты шариками, другие свободны. Выбран шарик, который нужно переместить, и место, куда его нужно переместить. Выбранный шарик за один шаг перемещается в соседнюю по горизонтали или вертикали свободную клетку. Требуется выяснить, возможно ли переместить шарик из начальной клетки в заданную, и если возможно, то найти путь из наименьшего количества шагов.

    Ограничения: $$2 \leq N \leq 40$$, время 1 с.

    Ввод из файла lihes.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – по $$N$$ символов. Символом точки обозначена свободная клетка, латинской заглавной $$0$$ – шарик, @ – исходное положение шарика, который должен двигаться, латинской заглавной $$X$$ — конечное положение шарика.

    Вывод в файл lihes.out. В первой строке выводится $$Y$$, если движение возможно, или $$N$$, если нет. Если движение возможно, далее следует $$N$$ строк по $$N$$ символов – как и на вводе, но буква $$X$$, а также все точки по пути заменяются плюсами.

    Примеры

    20. Покраска лабиринта. Лабиринт представляет собой квадрат, состоящий из $$N\times N$$ сегментов. Каждый из сегментов может быть либо пустым, либо заполненным камнем. Гарантируется, что левый верхний и правый нижний сегменты пусты. Лабиринт обнесен сверху, снизу, слева и справа стенами, оставляющими свободными только левый верхний и правый нижний углы. Директор лабиринта решил покрасить стены лабиринта, видимые изнутри (рис.). Помогите ему рассчитать количество краски, необходимой для этого.

    Ограничения: $$3 \leq N \leq 33$$, размер сегмента 3 x 3 м, высота стен 3 м, время 1 с.

    Ввод из файла paintlab.in. В первой строке находится число $$N$$, затем идут $$N$$ строк по $$N$$ символов: точка обозначает пустой сегмент, решетка – сегмент со стеной.

    Вывод в файл paintlab.out. Вывести одно число – площадь видимой части внутренних стен лабиринта в квадратных метрах.

    21. Поле для крикета. Жил-был жадный Король. Он приказал своему главному Архитектору построить поле для королевского крикета в парке. Король был таким жадным, что не послушал предложения своего Архитектора построить поле прямо в центре парка и окружить его живописным бордюром деревьев, специально посаженных вокруг. Вместо этого он приказал не срубать деревья и не сажать новых, но построить самое большое поле для крикета, какое только можно. Если Король обнаружит, что Архитектор посмел тронуть даже единственное дерево в парке или спроектировал меньшее поле, чем было возможно, Архитектор лишится головы. Более того, он потребовал от Архитектора представить план поля, где указаны его точное положение и размер.

    Ваша задача – помочь бедному Архитектору сохранить голову, написав программу, которая найдет максимальный размер поля для крикета и его положение внутри парка, удовлетворяющие требованиям Короля.

    Задача слегка упрощена тем, что парк Короля имеет прямоугольную форму и расположен на плоской поверхности. Более того, границы парка параллельны направлениям север – юг и восток – запад. В то же время игра в королевский крикет всегда происходит на квадратном поле, границы которого также параллельны направлениям север – юг и восток – запад. Архитектор уже сопоставил парку прямоугольную декартову систему координат и точно определил координаты каждого дерева.

    Оси этой системы координат, конечно, параллельны направлениям север – юг и восток – запад. Юго-западный угол парка имеет координаты (0, 0), а северо-восточный – координаты $$(W, H)$$, где $$W$$ и $$Н$$ – длина и ширина парка соответственно (рис.).

    В этой задаче вы можете пренебречь диаметром деревьев. Деревья не могут находиться внутри поля для крикета, но могут располагаться на его сторонах. Поле для крикета может также касаться границы парка, но не должно лежать вне парка.

    Ввод из файла cricket.in. Первая строка содержит три целых числа, $$N$$, $$W$$ и $$H$$, разделенных пробелами: $$N$$ — число деревьев в парке, $$W$$ и $$H$$ – длина и ширина парка соответственно.

    Следующие $$N$$ строк описывают координаты деревьев в парке. Каждая строка содержит два целых числа $$x_i$$ и $$y_i$$ разделенных пробелом и представляющих собой координаты $$i$$ -го дерева. Все деревья имеют различные координаты.

    Ограничения: $$1 \leq N \leq 100, 1 \leq W, H \leq 10 000, 0 \leq x_i \leq W, 0 \leq y_i \leq H$$, время 1 с.

    Вывод в файл cricket.out. Вывести через пробел три целых числа, $$P$$, $$Q$$ и $$L$$, где $$(P, Q)$$ – координаты юго-западного угла поля для крикета, $$L$$ – длина его сторон. Если существует несколько возможных положений поля максимального размера, вывести любое.

    Пример

    22. Электронная таблица. Напишите программу, выполняющую функции очень простой электронной таблицы. Она работает с таблицей из 9 строк от 1 до 9 и 26 столбцов от А до Z. Клетки таблицы обозначаются именами, составленными из кодов столбца и строки, например B1, S8.

    Каждая клетка содержит выражение. Выражения используют целые константы, ссылки на клетки, скобки, бинарные операторы +, -, * и / (целочисленное деление).

    Так, 567, E8/2, (3+B3)*(C4-l) являются правильными выражениями. Все операторы целочисленные. Деление на ноль дает в результате ноль.

    Если значение ячейки, на которую ссылается некоторое выражение, не определено, оно считается равным нулю. Ситуация, когда две или более ячейки зависят друг от друга, является отдельным случаем – циклической ссылкой.

    Ограничения: длина выражения в одной ячейке до 255 символов, все аргументы и результаты меньше 1 000 000, время 1 с.

    Ввод из файла sprsheet.in. Первая строка содержит число выражений $$N$$. Следующие N строк имеют формат <Имя клетки>=<выражение>. Все выражения корректные, и каждая ячейка определена не более чем одним выражением.

    Вывод в файл sprsheet.out. В единственной строке выводится или значение клетки A1, или число 1000000 (один миллион), если значение клетки A1 не может быть найдено из-за циклической ссылки.

    Пример

    23. Путь спелеолога. Пещера представлена кубом, разбитым на $$N$$ частей по каждому измерению (то есть на $$N^3$$ кубических клеток). Каждая клетка может быть или пустой, или полностью заполненной камнем. Исходя из положения спелеолога в пещере, требуется найти, какое минимальное количество перемещений по клеткам ему требуется, чтобы выбраться на поверхность. Переходить из клетки в клетку можно, только если они обе свободны и имеют общую грань.

    Ограничения: $$1 \leq N \leq 30$$, время 1 с.

    Ввод из файла speleo.in. В первой строке содержится число $$N$$. Далее следует $$N$$ блоков. Блок состоит из пустой строки и $$N$$ строк по $$N$$ символов: # обозначает клетку, заполненную камнями, точка – свободную клетку. Начальное положение спелеолога обозначено заглавной буквой $$S$$. Первый блок представляет верхний уровень пещеры, достижение любой свободной его клетки означает выход на поверхность. Выход на поверхность всегда возможен.

    Вывод в файл speleo.out. Вывести одно число – длину пути до поверхности.

    Пример

    Комментарий

    Нужно спуститься на уровень вниз, сделать два движения на запад, подняться на уровень вверх, сделать движение на юг, подняться на уровень вверх.

    24. Дырявая ткань. На столе лежат несколько кусков ткани, не перекрывая друг друга. Эти куски могут иметь дыры, в том числе и настолько большие, что в них может поместиться целый кусок ткани. Был получен черно-белый образ поверхности стола, на котором области, покрытые тканью, представлены символами *, а свободные площади – точками. Один кусок ткани, таким образом, представлен 4-связной областью символов *, то есть группой *, соседствующих друг с другом горизонтально или вертикально, но не по диагонали.

    На схеме три куска – один без дыр, а два – с одной дырой каждый: первый – площадью 8, второй – площадью 12.

    Ваша цель – найти кусок с наибольшим количеством дыр в нем. Дыра – это 4-связная область точек, полностью окруженных символами *. Если несколько кусков имеют одинаковое количество дыр, нужно выбрать кусок минимальной площади.

    Ввод из файла holey.in. В первой строке содержатся два числа $$W$$ и $$H$$, разделенные пробелами. Следующие $$H$$ строк содержат по $$W$$ символов каждая. Символы в этих строках – или * (ASCII 42), или точка (ASCII 46).

    Ограничения: $$1 \leq W, H \leq 100$$, время 1 с.

    Вывод в файл holey.out. Вывести одно целое число – площадь минимального из наиболее дырявых кусков. Если нет кусков с дырами, выходной файл должен содержать ноль.

    Пример

    25. Несоставляемое число. Даны $$N$$ натуральных чисел. Найти минимальное натуральное число, не представимое суммой никаких из этих чисел, если в эту сумму каждое исходное число может входить не более одного раза.

    Ограничения: $$1 \leq N \leq 10 000$$, значения исходных чисел от 1 до 1 000 000 000, время 1 с.

    Ввод из файла nosum.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – по одному натуральному числу.

    Вывод в файл nosum.out. Вывести одно число.

    Примеры

    26. SMS. Сообщения SMS сотового телефона MOBILA (рис.) составлены из прописных латинских букв. Если буква первая на кнопке, нужно нажать эту кнопку один раз, чтобы добавить букву в сообщение. Если буква вторая — нужно нажать кнопку дважды и т. д. Так, чтобы набрать слово "SMS", нужно нажать

    (PQRS)(PQRS)(PQRS)(PQRS)(MNO)(PQRS)(PQRS)(PQRS)(PQRS)

    Чтобы ввести две буквы, находящиеся на одной кнопке, нужно между нажатиями клавиши сделать паузу. Например, чтобы ввести сообщение "АА", нужно нажать (АВС)(пауза)(АВС)

    Если на кнопке три буквы, то, как только такая кнопка нажата три раза, последняя буква добавляется в сообщение немедленно, а следующие нажатия той же кнопки относятся к следующей букве сообщения. Аналогично, если на кнопке четыре буквы, то после четырех нажатий в сообщение будет добавлена последняя буква. То есть последовательность нажатий

    (АВС)(АВС)(АВС)(АВС)(пауза)(АВС)

    соответствует сообщению "САА". К сожалению, сотовые телефоны этой модели давно не производятся, и остался только один такой телефон. Он может произвольно вставлять и игнорировать паузы во время ввода сообщения, что может привести к некоторым изменениям в сообщениях. Например, введя MOSCOWQUARTERFINAL, можно получить вместо этого OMSCMNWQTTARTERPDEINAL. Вы получили SMS-сообщение и знаете, что оригинальное сообщение содержало $$N$$ букв.

    Чтобы определить вероятность угадывания оригинального сообщения, найдите число возможных сообщений, которые могли превратиться в то, которое вы получили.

    Ограничения: $$1 \leq N \leq 80$$, полученное сообщение состоит только из прописных латинских букв, длина полученного сообщения – от 1 до 80 букв, время 2 с.

    Ввод из файла sms.in. В первой строке задана длина оригинального сообщения $$N$$. Вторая строка содержит полученное SMS-сообщение.

    Вывод в файл sms.out. Вывести число сообщений из $$N$$ букв, которые, будучи набранными на этом телефоне, могут превратиться в данное сообщение.

    Примеры

    27. Lines. В таблице из $$N$$ строк и $$N$$ столбцов некоторые клетки заняты шариками, другие свободны. Выбран шарик, который нужно переместить, и место, куда его нужно переместить. Выбранный шарик за один шаг перемещается в соседнюю по горизонтали или вертикали свободную клетку. Требуется выяснить, возможно ли переместить шарик из начальной клетки в заданную, и если возможно, то найти путь из наименьшего количества шагов.

    Ограничения: $$2 \leq N \leq 250$$, время 1 с.

    Ввод из файла lines2.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – по $$N$$ символов. Символом точки обозначена свободная клетка, латинской заглавной 0 — шарик, @ — исходное положение шарика, который должен двигаться, латинской заглавной $$X$$ — конечное положение шарика.

    Вывод в файл lines2.out. В первой строке выводится $$Y$$, если движение возможно, или $$N$$, если нет. Если движение возможно, далее следует $$N$$ строк по $$N$$ символов – как и на вводе, но $$X$$, а также все точки по пути заменяются плюсами.

    Примеры

    28. Удаление клеток. Из прямоугольного листа клетчатой бумаги ( $$М$$ строк, $$N$$ столбцов) удалили некоторые клетки. На сколько кусков распадется оставшаяся часть листа? Две клетки не распадаются, если они имеют общую сторону.

    Ограничения: $$1 \leq M, N \leq 100$$, время 1 с.

    Ввод из файла remsquar.in. В первой строке находятся числа $$M$$ и $$N$$, в следующих $$М$$ строках – по $$N$$ символов. Если клетка не была вырезана, этому соответствует знак #, если вырезана – точка.

    Вывод в файл remsquar.out. Вывести одно число.

    Пример

    Страницы:

    Задание 1. Указатели

    Решите уравнение указанным в варианте методом. Функцию передать как параметр с помощью указателя.

    Численные методы решения уравнений

    Довольно часто на практике приходится решать уравнения вида:$$F(x)=0$$ где функция $$F(x)$$ определена и непрерывна на некотором конечном или бесконечном интервале$$\alpha < x < \beta$$

    Всякое значение $$\overline{x}$$ такое, что $$F(\overline{x})\equiv 0$$, называется корнем уравнения, а нахождение этого значения и есть решение уравнения.

    На практике в большинстве случаев найти точное решение возникшей математической задачи не удается. Поэтому важное значение приобрели численные методы, позволяющие найти приближенное значение корня. Под численными методами подразумеваются методы решения задач, сводящиеся к арифметическим и некоторым логическим действиям над числами, т.е. к тем действиям, которые выполняет компьютер.

    Существует множество численных методов решения уравнений вида (1). Рассмотрим только три из них:

  • метод итераций;
  • метод Ньютона;
  • метод половинного деления.
  • Метод итераций

    Представим уравнение $$F(x)=0$$ в виде:$$x=f(x)$$

    Это уравнение получается выделением $$x$$ из уравнения $$F(x)$$ и переносом того, что осталось, т.е. $$f(x)$$, в левую часть уравнения. Иначе можно получить уравнение (2) следующим способом: левую и правую часть уравнения (1) умножить на произвольную константу $$\lambda$$ и прибавить к левой и правой части $$x$$, т.е. получаем уравнение вида:$$x=x+\lambda F(x)$$ где $$f(x)=x+\lambda F(x)$$.

    На заданном отрезке $$[a; b]$$ выберем точку $$х_0$$ – нулевое приближение – и найдем$$x_1=f(x_0),$$ потом найдем:$$x_2=f(x_1),$$

    Таким образом, процесс нахождения корня уравнения сводится к последовательному вычислению чисел:$$x_n=f(x_{n-1})\quad n=1,2,3 \ldots .$$ Этот процесс называется методом итераций.

    Если на отрезке $$[a; b]$$ выполнено условие:$$|f'(x_0)|\leq q<1,$$ то процесс итераций сходится, т.е.$$\lim_{n\rightarrow\infty}x_n=\overline{x}$$

    Процесс итераций продолжается до тех пор, пока$$|x_n-x_{n-1}|\leq\varepsilon,$$ где – $$\varepsilon$$ заданная абсолютная погрешность корня $$x$$. При этом будет выполняться:$$|\overline{x}-x_n|\leq\varepsilon,$$

    Метод Ньютона

    Пусть уравнение $$F(x)=0$$ имеет один корень на отрезке $$[a; b]$$, причем $$F'(x)$$ и $$F''(x)$$ определены, непрерывны и сохраняют постоянные знаки на отрезке $$[a; b]$$.

    Выберем на отрезке $$[a; b]$$ произвольную точку $$х_0$$ – нулевое приближение. Затем найдем:$$x_1=x_0-\frac{F(x_0)}{F'(x_0)}$$ потом$$x_2=x_1-\frac{F(x_1)}{F'(x_1)}$$

    Таким образом, процесс нахождения корня уравнения сводится к вычислению чисел $$x_n$$ по формуле:$$x_n=x_{n-1}-\frac{F(x_{n-1})}{F'(x_{n-1})},\quad n=1,2,3\ldots$$

    Этот процесс называется методом Ньютона.

    Процесс вычисления продолжается до тех пор, пока не будет выполнено условие:$$|x_n-x_{n-1}|\leq\varepsilon,$$ где – $$\varepsilon$$ заданная абсолютная погрешность корня $$x$$.

    Точку $$х_0$$ необходимо выбирать так, чтобы выполнялось условие:$$F(x_0)\dot F'(x_0)>0,$$ иначе метод не будет сходиться.

    Метод половинного деления

    Пусть уравнение $$F(x_0)$$ имеет один корень на отрезке $$[a, b]$$. Функция непрерывна на отрезке $$[a, b]$$.

    Метод половинного деления заключается в следующем:

    Сначала выбираем начальное приближение, деля отрезок пополам, т.е.$$x_0=(a+b)/2.$$

    Если $$F(x_0)=0$$, то $$x_0$$ является корнем уравнения. Если $$F(x_0)\neq 0,$$ то выбираем тот из отрезков, на концах которого функция имеет противоположные знаки. Полученный отрезок снова делим пополам и выполняем действия сначала и т.д.

    Процесс деления отрезка продолжаем до тех пор, пока длина отрезка, на концах которого функция имеет противоположные знаки, не будет меньше заданной точности $$\varepsilon$$, т.е. пока не будет выполняться условие:$$|x_n-x_{n-1}|\leq\varepsilon.$$

    Варианты задания

    Уравнение Отрезок, содержащий корень Метод Значение корня с точностью 10-4
    1 $$3\sin\sqrt{x}+0,35x-3,8=0$$ [2;3] Итераций 2,2985
    2 $$0,25x^3+x-1,2502=0$$ [0;2] Ньютона 1,0001
    3 $$x-\frac{1}{3+\sin 3,6x}=0$$ [0;0,85] Итераций 0,2624
    4 $$0,1x^2-x\ln x=0$$ [1;2] Ньютона 1,1183
    5 $$\tg x=\frac13\tg^3 x+\frac15\tg^5 x-\frac13=0$$ [0;8] Половинного деления 0,3333
    6 $$\arccos x-\sqrt{1-0,3 x^3}=0$$ [0;1] Итераций 0,5629
    7 $$3x-4\ln x-5=0$$ [2;4] Ньютона 3,2300
    8 $$\cos\frac{2}{x}-2\sin\frac{1}{x}+\frac{1}{x}=0$$ [1;2] Половинного деления 1,8756
    9 $$\sqrt{1-0,4x^2}-\arcsin x=0$$ [0;1] Итераций 0,7672
    10 $$e^x-e^{-1}-2=0$$ [0;1] Ньютона 0,8814
    11 $$\sin(\ln x)-\cos(\ln x)+2\ln x=0$$ [1;3] Половинного деления 1,3749
    12 $$x-2+\sin\frac{1}{x}=0$$ [1,2;2] Итераций 1,3077
    13 $$e^x+\ln x-10x=0$$ [3;4] Ньютона 3,5265
    14 $$\cos x-e^{\frac{-x^2}{2}}+x-1=0$$ [1;2] Половинного деления 1,0804
    15 $$1-x+\sin x-\ln(1+x)=0$$ [0;1,5] Итераций 1,1474
    16 $$3x-14+e^x-e^{-x}=0$$ [1;3] Ньютона 2,0692
    17 $$\sqrt{1-x}-\tg x=0$$ [0;1] Половинного деления 0,5768
    18 $$x+\cos(x^{0.52}+2)=0$$ [0,5;1] Итераций 0,9892
    19 $$3\ln^2 x+6\ln x-5=0$$ [1;3] Ньютона 1,8832
    20 $$\sin x^2+\cos x^2-10x=0$$ [0;1] Половинного деления 0,1010
    21 $$x^2-\ln(1+x)-3=0$$ [2;3] Итераций 2,0267
    22 $$2x\sin x-\cos x=0$$ [0,4;1] Ньютона 0,6533
    23 $$e^x+\sqrt{1+e^{2x}}-2=0$$ [-1;0] Половинного деления -0,2877
    24 $$\ln x-x+1.8=0$$ [2;3] Итераций 2,8459
    25 $$\sqrt[3]{x-4}-\frac{1}{x^2+1}=0$$ [4;6] Ньютона 4,0002
    26 $$e^x-2\cos x=0$$ [0;2] Половинного деления 0,5398
    27 $$\sqrt[3]{x+2}-3x+16=0$$ [4;7] Итераций 6,0000
    28 $$\frac{\pi\sin x}{x}-3\cos x-2=0$$ [1;2] Ньютона 1,5708

    Задание 2. Строки

  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все вхождения первой буквы этого слова (количество пробелов между словами не изменять).
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить количество слов, которые начинаются и заканчиваются одной и той же буквой.
  • В языке используется латинский алфавит. Глагол прошедшего времени получается из глагола настоящего времени изменением порядка следования гласных ( а, о, u, i, е ) на обратный. Согласные остаются на своих местах. Например, глагол padbote преобразуется в pedbota. Задается глагол настоящего времени. Преобразовать его в глагол прошедшего времени и напечатать.
  • Дана строка-предложение из символов латинского алфавита. Вывести самое короткое слово в предложении (если таких слов несколько, то вывести первое из них).
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат ровно три буквы ' А '.
  • Дана строка из символов латинского алфавита. Проверьте правильность расстановки тега <td>: каждому открытому тегу должен соответствовать закрытый </td>.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить длину самого длинного слова.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Вывести строку, содержащую эти же слова, но разделенные одним символом '.' (точка). В конце точку не ставить.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все вхождения последней буквы этого слова (количество пробелов между словами не изменять).
  • Предложение состоит из слов, разделенных одним или несколькими пробелами. Написать программу, печатающую все слова, оканчивающиеся на заданный символ.
  • В предложении, состоящем из слов, разделенных одним пробелом, заменить первую букву у слов, следующих за словами die, der, das, на прописную.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Преобразовать каждое слово в строке, удалив из него все вхождения заданного символа (количество пробелов между словами не изменять).
  • Дана строка-предложение из символов латинского алфавита. Преобразовать строку так, чтобы каждое слово начиналось с заглавной буквы.
  • Дана строка-предложение из символов латинского алфавита. Вывести самое длинное слово в предложении (если таких слов несколько, то вывести последнее из них).
  • Определить, сколько раз в строке встречается заданное слово.
  • В записке слова зашифрованы – каждое из них записано наоборот. Расшифровать сообщение.
  • Дана строка из восьми цифровых символов. Переведите ее в формат даты "dd-mm-yyyy" и проверьте корректность такой даты.
  • Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими). Определить количество слов, которые содержат введенный символ.
  • Выясните, имеются ли среди введенных символов все буквы, входящие в слово "yandex".
  • Предложение состоит из слов, разделенных одним или несколькими пробелами. Написать программу, печатающую все слова, начинающиеся на введенный символ.
  • В английском предложении слова разделены одним пробелом. Во всех словах, следующих за артиклями а и the, первую букву заменить на прописную. Написать программу, выполняющую эту работу.
  • Написать программу, определяющую, какой процент слов в английском тексте содержит удвоенную согласную.
  • В языке используется латинский алфавит, причастие всегда оканчивается суффиксом "ings". Задана строка слов, в которой слова отделяются одним или несколькими пробелами. Напечатать причастия, имеющиеся в этой строке.
  • Дана строка из малых символов латинского алфавита. Замените каждый символ на следующий за ним по алфавиту, символ 'z' замените на 'a'.
  • Дана строка из символов латинского алфавита. Замените все вхождения строки "two" на символ '2'.
  • Отредактировать заданное предложение, удаляя из него те слова, которые встречаются в предложении заданное число раз.
  • Определите, какой процент от каждого слова составляют входящие в него цифры.
  • Дан текст, состоящий из символов латинского алфавита, пробелов и знаков пунктуации. Найдите самую часто встречающуюся гласную букву (без учета регистра).
  • Задание 3. Одномерный массив: преобразование массива

    Решите задачи данной группы, оформив решение в виде функций генерации, вывода и обработки массивов. Предусмотрите в функции генерации массива ввод границ диапазона случайных чисел.

  • Заменить все положительные элементы целочисленного массива, состоящего из n элементов, на значение минимального.
  • Дан массив, состоящий из n элементов. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой больше k, на один наименьший элемент массива. Если таких серий нет, то массив оставить без изменений.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив первую серию наибольшей длины на один элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Вставить перед каждой серией минимальный элемент массива.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами наибольшую первую и k -ю серии массива. Если таких серий в массиве меньше k, то вывести массив без изменений.
  • Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся менее двух раз.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив перед каждым положительным элементом минимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив каждую его серию на один элемент.
  • Заменить все отрицательные элементы целочисленного массива, состоящего из n элементов, на значение максимального.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Удалить из массива все серии, длина которых меньше k.
  • Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся более двух раз.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив после каждого отрицательного элемента минимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, увеличив все серии наибольшей длины на один элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами наименьшую последнюю и k -ю серии массива. Если таких серий в массиве меньше k, то вывести массив без изменений.
  • Заменить все положительные элементы целочисленного массива, состоящего из n элементов, на значение максимального.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Удалить из массива все серии, длина которых больше k. Если таких серий нет, то массив оставить без изменений.
  • Дан целочисленный массив, состоящий из n элементов. Удалить из массива все элементы, встречающиеся ровно два раза.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой равна k, на один элемент, равный сумме наибольшего и наименьшего элементов массива.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив перед каждым отрицательным элементом максимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Преобразовать массив, уменьшив каждую его серию на один элемент.
  • Даны два массива A и B, состоящие из n элементов каждый, элементы которых упорядочены по убыванию. Объединить эти массивы так, чтобы результирующий массив остался упорядоченным
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Вставить после каждой серии максимальный элемент массива.
  • Заменить все отрицательные элементы целочисленного массива, состоящего из n элементов, на значение минимального.
  • Дан массив, состоящий из n элементов. Преобразовать его, вставив после каждого положительного элемента максимальный элемент.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Заменить каждую серию, длина которой меньше k, на один наибольший элемент массива.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Поменять местами первую и последнюю серии наибольшей длины. Если серия с максимальной длиной единственная, то массив не изменять.
  • Дан массив, состоящий из n элементов. Назовем серией группу подряд идущих одинаковых элементов, а длиной серии – количество этих элементов (длина серии может быть равна 1). Переставить первую серию минимальной длины с последней серией максимальной длины. Если максимальная длина равна минимальной, то меняются первые и последние серии.
  • Задание 4. Одномерный массив: сортировка массива

    Решите задачи данной группы, оформив решение в виде функций генерации, вывода и обработки массивов. Предусмотрите в функции генерации массива ввод границ диапазона случайных чисел.

  • Отсортируйте в массиве нечетные элементы по убыванию.
  • Организуйте массив, содержащий 20 различных случайных целых чисел. После этого элементы массива упорядочиваются по убыванию, и содержимое отсортированного массива выводится на экран.
  • Сортировка подсчетом. Выходной массив заполняется значениями –1. Затем для каждого элемента определяется его место в выходном массиве путем подсчета количества элементов, строго меньших данного. Естественно, что все одинаковые элементы попадают на одну позицию, за которой следует ряд значений –1. После этого оставшиеся в выходном массиве позиции со значением –1 заполняются копией предыдущего значения.
  • Организуйте массив, содержащий 15 различных целых чисел. После этого отдельно первые 5 элементов, вторые 5 элементов и последние 5 элементов сортируются по возрастанию. Содержимое отсортированного таким образом массива выводится на экран.
  • "Хитрая" сортировка. Из массива путем однократного просмотра выбирается последовательность элементов, расположенных в порядке возрастания, переносится в выходной массив и заменяется во входном значением -1. Затем оставшиеся элементы включаются в полученную упорядоченную последовательность методом "погружения", когда очередной элемент путем ряда обменов "погружается" до требуемой позиции в уже упорядоченную часть массива.
  • Дано линейное множество A из N точек. Найти такую точку из данного множества, сумма расстояний от которой до остальных его точек максимальна, и саму эту сумму.
  • Дано линейное множество A из N точек. Найти пару различных точек этого множества с максимальным расстоянием между ними и само это расстояние (точки выводятся в том же порядке, в котором они перечислены при задании множества A ).
  • Организуйте массив, содержащий 2n целых чисел. Отсортируйте элементы с нечётными индексами по возрастанию.
  • Дан массив размера N. Вывести индексы массива в том порядке, в котором соответствующие им элементы образуют возрастающую последовательность.
  • Отсортируйте в массиве четные элементы по возрастанию.
  • Создайте целочисленный массив, содержащий 2n различных чисел. Отсортируйте первую половину массива по возрастанию, а вторую по убыванию. Выведите на экран, отсортированный таким образом массива.
  • Отсортируйте в массиве положительные элементы по возрастанию, отрицательные – по убыванию.
  • Массивы А и В заполнены случайными различными числами, причем в В в 2 раза меньше элементов, чем в А. Определите входят ли все элементы В в А.
  • Дан массив размера N. Вывести индексы массива в том порядке, в котором соответствующие им элементы образуют убывающую последовательность.
  • На координатной прямой дана точка A и множество B из N точек. Найти номер точки из множества B, наиболее близкой от точки A.
  • Организуйте массив, содержащий 2n целых чисел. Отсортируйте элементы с нечётными индексами по убыванию.
  • Дано линейное множество A из N точек. Найти такую точку из данного множества, сумма расстояний от которой до остальных его точек минимальна, и саму эту сумму.
  • Дана точка A и множество B из N точек. Найти номер точки из множества B, наиболее удаленной от точки A.
  • Дано линейное множество A из N точек. Найти пару различных точек этого множества с минимальным расстоянием между ними и само это расстояние (точки выводятся в том же порядке, в котором они перечислены при задании множества A ).
  • Даны множества A и B, состоящие соответственно из N1 и N2 точек. Найти максимальное расстояние между точками этих множеств и сами точки, расположенные на этом расстоянии.
  • В массиве 2 n + 1 различных элементов. Найдите средний элемент массива. Под средним элементом понимают такой, для которого в массиве n элементов больше его и n элементов меньше.
  • Даны линейные множества A и B, состоящие соответственно из N1 и N2 точек. Найти минимальное расстояние между точками этих множеств и сами точки, расположенные на этом расстоянии.
  • В массиве 3n элементов. Отсортируйте первые n элементов массива по убыванию, последние n элементов по возрастанию.
  • Даны два массива А и В. Сформируйте из них массив С, в котором элементы отсортированы по убыванию.
  • Дан целочисленный массив А. Отсортируйте по возрастанию те его элементы, которые входят во введенный отрезок $$[a, b]$$.
  • Дано линейное множество A из N точек. Найти такую точку из данного множества, которая наиболее близка к значению среднего арифметического элементов массива.
  • Дан массив А, состоящий из 2N элементов. Разбейте его на массивы В и С по N элементов каждый так, чтобы каждый элемент В не превосходил каждого элемента С.
  • Дан массив А, состоящий из N целых чисел. Сформируйте массив В, состоящий из убывающей последовательности различных элементов массива А.
  • Задание 5. Двумерный массив

    Решите задачи данной группы, оформив решение в виде функций генерации, вывода и обработки массивов. Предусмотрите в функции генерации массива ввод границ диапазона случайных чисел.

  • Дана квадратная матрица порядка $$2n + 1$$. Зеркально отразить ее элементы относительно горизонтальной оси симметрии матрицы.
  • Даны действительные числа $$a_1, \ldots, а_{64}$$. Получить действительную квадратную матрицу порядка 8, элементами которой являются числа $$a_1, \ldots, а_{64}$$, расположенные в ней по схеме, которая приведена на рисунке.
  • Дана матрица размера $$n \times m$$. Поменять местами ее столбцы так, чтобы их максимальные элементы образовывали убывающую последовательность.
  • Найдите квадратную матрицу, обратную данной с размером $$n \times n$$.
  • Дана квадратная матрица порядка $$2n$$. Повернуть ее на 180 градусов в положительном направлении.
  • Заполнить двумерный квадратный массив целыми числами от 1 до 100 по спирали, как показано на следующем рисунке.
  • Даны действительные числа $$a_1, \ldots, а_{64}$$. Получить действительную квадратную матрицу порядка 8, элементами которой являются числа $$a_1, \ldots, а_{64}$$, расположенные в ней по схеме, которая приведена на рисунке.
  • Дана матрица размера $$n \times m$$. Поменять местами столбцы, содержащие минимальный и максимальный элементы матрицы.
  • Даны две матрицы $$n \times m$$ и $$m \times k$$. Получите их произведение.
  • Дана матрица размера $$n \times m$$. Поменять местами ее строки так, чтобы их максимальные элементы образовывали возрастающую последовательность.
  • В данной действительной квадратной матрице порядка $$n$$ найти наибольший по модулю элемент. Получить квадратную матрицу порядка $$n – 1$$ путем выбрасывания из исходной матрицы какой-нибудь строки и столбца, на пересечении которых расположен элемент с найденным значением. Выполняйте до тех пор, пока не останется последний элемент.
  • Дана квадратная матрица порядка $$2n+1$$. Зеркально отразить ее элементы относительно побочной диагонали матрицы.
  • Дана действительная квадратная матрица порядка $$2n+1$$. Получить новую матрицу, повернув ее блоки, ограниченные диагоналями, на 180 градусов.
  • Дана матрица размера $$n \times m$$. Поменять местами ее первый и последний строки, содержащие только отрицательные элементы.
  • Дана целочисленная матрица размера $$n \times m$$. Найти элемент, являющийся максимальным в своей строке и минимальным в своем столбце. Если такой элемент отсутствует, то вывести 0.
  • Составьте программу циклической перестановки столбцов двумерного массива $$m \times k$$, при которой смещение происходит вправо на n столбцов.
  • Даны действительные числа $$a_1, \ldots, а_{64}$$. Получить действительную квадратную матрицу порядка 8, элементами которой являются числа $$a_1, \ldots, а_{64}$$, расположенные в ней по схеме, которая приведена на рисунке.
  • Дана матрица размера $$n \times m$$. Поменять местами ее столбцы так, чтобы их минимальные элементы образовывали возрастающую последовательность.
  • Дана квадратная матрица порядка $$2n + 1$$. Зеркально отразить ее элементы относительно вертикальной оси симметрии матрицы.
  • Дана квадратная матрица порядка $$2n$$. Повернуть ее на 270 градусов в положительном направлении относительно ее центра.
  • Дана матрица размера $$n \times m$$. Поменять местами строки, содержащие минимальный и максимальный элементы матрицы.
  • В квадратной таблице обменяйте местами элементы строки и столбца, на пересечении которых находится минимальный из положительных элементов.
  • Дана квадратная матрица порядка $$2n$$. Повернуть ее на 90 градусов в положительном направлении относительно ее центра.
  • Дана квадратная матрица порядка $$2n + 1$$. Зеркально отразить ее элементы относительно главной диагонали матрицы.
  • Составьте программу циклической перестановки строк двумерного массива $$m \times k$$, при которой смещение происходит вниз на $$n строк$$.
  • Дана матрица размера $$n \times m$$. Поменять местами ее первый и последний столбцы, содержащие только положительные элементы.
  • Заполнить двумерный квадратный массив целыми числами от 1 до 100 по спирали, начиная от центра и закручивая по часовой стрелке.
  • Заполните квадратную матрицу $$n \times n$$ по принципу латинского квадрата: в каждой строке и каждом столбце используются неповторяющиеся между собой числа от 1 до $$n$$.
  • Задание 6. Файлы

    Организуйте работу с текстовым файлом. Исходные файлы не предполагают изменения. Измененные данные сохраните в другом файле.

  • Даны два текстовых файла с именами Name1 и Name2. Добавить в конец каждой строки файла Name1 соответствующую строку файла Name2. Если файл Name2 короче файла Name1, то выполните переход к началу файла Name2.
  • Организовать текстовый файл, состоящий из N строк. Определить максимальный и минимальный размер строки в файле и вывести их в другой файл.
  • Дан текстовый файл с именем NameT. Подсчитать число повторений в нем строчных русских букв ( 'а' – 'я' ) и создать файл с именем NameS, строки которого имеют вид: " <буква> – <число повторений данной буквы> ". Буквы, отсутствующие в тексте, в файл не включать. Строки упорядочить по убыванию числа повторений букв, а при равном числе повторений – по возрастанию кодов букв.
  • Дан символ 'C' (прописная латинская буква) и текстовый файл. Создать строковый файл, содержащий все слова из исходного файла, начинающиеся этой буквой (как прописной, так и строчной). Знаки препинания, расположенные в начале и в конце слов, не учитывать. Если исходный файл не содержит подходящих слов, оставить результирующий файл пустым.
  • В отсортированный файл фамилий добавить новую фамилию, не нарушив его упорядоченность.
  • Дан текстовый файл. Создать файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке возрастания их кодов.
  • Организовать текстовый файл f состоящий из N строк. После этого организовать файлы h и g. В файл h записать строки файла f занимающие нечётные позиции, в файл g чётные.
  • Дан текстовый файл f. Создать файл g, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке следования в исходном файле.
  • Дано целое число N и текстовый файл с именем Name1, содержащий один абзац текста, выровненный по левому краю. Отформатировать текст так, чтобы его ширина не превосходила N позиций, и выровнять текст по левому краю. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле с именем Name2.
  • Организовать текстовый файл f, состоящий из N строк. Организовать замену символов в файле. "Старый" символ и "новый" символ запрашиваются и вводятся с клавиатуры. Изменение вывести в другой файл.
  • Дан текстовый файл. Вывести в другой файл самые длинные слова текста (с учетом знаков препинания, расположенных в начале и в конце слов).
  • Добавить в указанное место файла заданное количество строк, начиная с указанного места другого файла. Место задается номером строки. Результат вывести в третий файл.
  • В файле хранятся названия товаров и цены в рублях 1997 г. Создать новый файл, преобразовав цены товара в рубли и копейки 1998 г., добавив наименование "руб." и "коп.". В указанный год цены уменьшились в 1000 раз.
  • Удалить заданное количество строк из указанного места файла. Изменения вывести в другой файл. Если действие невозможно, вывести об этом сообщение на экран и в выходной файл
  • Организовать текстовый файл f, состоящий из N строк. После этого создать текстовый файл g, содержащий строки текстового файла f в обратном порядке.
  • Дан файл, содержащий текст, выровненный по левому краю (длина каждой строки не превышает 50 символов). Выровнять его по правому краю, добавив в начало каждой непустой строки необходимое количество пробелов. Выровненный текст записать в другой файл.
  • Организовать текстовый файл, состоящий из N строк. Вывести на экран и в другой файл строки, размер которых больше среднего размера строки в файле.
  • Дан текстовый файл. Создать файл, содержащий все знаки препинания, встретившиеся в текстовом файле (в том же порядке).
  • Организовать текстовый файл, состоящий из N строк. Заменить в файле все маленькие латинские буквы на большие и вывести это в другой файл.
  • Дан текстовый файл. Вывести в другой файл самые короткие слова текста (с учетом знаков препинания, расположенных в конце слов). Короткое слово не является пустым.
  • Организовать текстовый файл, состоящий из N строк. Заменить в нем все строки данной длины новой строкой. Длину заменяемых строк и содержимое новой строки запрашивается и вводится с клавиатуры. Если таких строк нет, то данные не изменять. Изменение вывести в новый файл.
  • Дано число N и текстовый файл. Удалить из файла строки с номерами, кратными N. Пустые строки не учитывать и не удалять. Если строки с требуемыми номерами отсутствует, то оставить файл без изменений. Изменение вывести в другой файл.
  • Дан текстовый файл, содержащий текст, выровненный по левому краю (длина каждой строки не превышает 50 символов). Выровнять его по центру, добавив в начало каждой непустой строки необходимое количество пробелов. Строки нечетной длины перед центрированием дополнять слева пробелом. Выровненный текст записать в другой файл.
  • Организовать текстовый файл, состоящий из N строк. Преобразовать файл, удалив в каждой его строке лишние пробелы. Изменения вывести в другой файл.
  • Дан файл с текстом из символов латинского алфавита. Зашифровать файл, выполнив циклический сдвиг каждой буквы вперед на n позиций в алфавите. Знаки препинания и пробелы не изменять.
  • Даны числа N1, N2 и текстовый файл. Удалить из файла строки с номерами, заключенными между N1, N2, не включая границ. Изменения вывести в другой файл. Если выполнить удаление невозможно, выдайте об этом сообщение на экран и в выходной файл.
  • Дан файл с текстом из символов латинского алфавита, цифр и знаков. Замените все цифры их названиями на английском языке. Изменения вывести в другой файл.
  • Организовать текстовый файл f состоящий из N строк. После этого организовать файлы h и g. В файл h записать строки файла f нечётной длины, в файл g чётной длины.
  • Задание 7. Динамические массивы

    Решите задачи данной группы, выполняя следующие требования:

  • Сформировать динамический двумерный массив, заполнить его случайными числами и вывести на экран.
  • Выполнить указанное в варианте задание и вывести полученный массив на экран.
  • Варианты задания

    Вид преобразования массива
    1 Добавить строку с заданным номером.
    2 Добавить столбец с заданным номером.
    3 Добавить строку в конец матрицы.
    4 Добавить столбец в конец матрицы.
    5 Добавить строку в начало матрицы.
    6 Добавить столбец в начало матрицы.
    7 Добавить К строк в конец матрицы.
    8 Добавить К столбцов в конец матрицы.
    9 Добавить К строк в начало матрицы.
    10 Добавить К столбцов в начало матрицы.
    11 Удалить строку с номером К.
    12 Удалить столбец с номером К.
    13 Удалить строки, начиная со строки К1 и до строки К2.
    14 Удалить столбцы, начиная со столбца К1 и до столбца К2.
    15 Удалить все четные строки.
    16 Удалить все четные столбцы.
    17 Удалить все строки, в которых есть хотя бы один нулевой элемент.
    18 Удалить все столбцы, в которых есть хотя бы один нулевой элемент.
    19 Удалить строку, в которой находится наибольший элемент матрицы.
    20 Добавить строки после каждой четной строки матрицы.
    21 Добавить столбцы после каждого четного столбца матрицы.
    22 Добавить К строк, начиная со строки с номером N.
    23 Добавить К столбцов, начиная со столбца с номером N.
    24 Добавить строку после строки, содержащей наибольший элемент.
    25 Добавить столбец после столбца, содержащего наибольший элемент.
    26 Добавить строку после строки, содержащей наименьший элемент.
    27 Добавить столбец после столбца, содержащего наименьший элемент.
    28 Удалить строку и столбец, на пересечении которых находится наибольший элемент массива.

    Задание 8. Динамические структуры

    Решите задачи данной группы, выполняя следующие требования:

  • Сформировать идеально сбалансированное бинарное дерево, тип информационного поля указан в варианте.
  • Распечатать полученное дерево.
  • Выполнить обработку дерева в соответствии с заданием, вывести полученный результат.
  • Преобразовать идеально сбалансированное дерево в дерево поиска.
  • Распечатать полученное дерево.
  • Варианты задания

    Тип информационного поля Критерии поиска
    1 $$char$$ Найти количество элементов с заданным ключом.
    2 $$int$$ Найти максимальный элемент в дереве.
    3 $$char*$$ Найти количество листьев в дереве.
    4 $$double$$ Найти минимальный элемент в дереве.
    5 $$char$$ Найти высоту дерева.
    6 $$int$$ Найти среднее арифметическое элементов дерева.
    7 $$char*$$ Найти количество элементов дерева, начинающихся с заданного символа.
    8 $$char$$ Найти количество элементов с заданным ключом.
    9 $$double$$ Найти максимальный элемент в дереве.
    10 $$int$$ Найти количество листьев в дереве.
    11 $$double$$ Найти минимальный элемент в дереве.
    12 $$char$$ Найти высоту дерева.
    13 $$int$$ Найти среднее арифметическое элементов дерева.
    14 $$char$$ Найти количество элементов с заданным ключом.
    15 $$char*$$ Найти количество элементов дерева, начинающихся с заданного символа
    16 $$int$$ Найти максимальный элемент в дереве.
    17 $$double$$ Найти количество листьев в дереве.
    18 $$int$$ Найти минимальный элемент в дереве.
    19 $$char$$ Найти высоту дерева.
    20 $$double$$ Найти среднее арифметическое элементов дерева.
    21 $$char*$$ Найти количество элементов дерева, начинающихся с заданного символа.
    22 $$char$$ Найти количество элементов с заданным ключом.
    23 $$char$$ Найти количество листьев в дереве.
    24 $$double$$ Найти максимальный элемент в дереве.
    25 $$double$$ Найти минимальный элемент в дереве.
    26 $$char$$ Найти высоту дерева.
    27 $$float$$ Найти среднее арифметическое элементов дерева.
    28 $$int$$ Найти количество элементов с заданным ключом.

    Задание 9. Рекурсивные алгоритмы

    Разработайте рекурсивный алгоритм для решения задачи.

    1-10. Определите закономерность формирования членов последовательности. Найдите $$N$$ -ый член последовательности, сократив количество рекурсивных вызовов.

  • $$1, 1, 2, 3, 5, \ldots$$
  • $$1, 2, 2, 4, 8, \ldots$$
  • $$1, 1, \frac12, \frac23, \frac67, \ldots$$
  • $$1,2,\frac12,4,\frac18,\ldots$$
  • $$1,1,\sqrt{2},\sqrt{1+\sqrt{2}},\sqrt{\sqrt{2}+\sqrt{1+\sqrt{2}}},\ldots$$
  • $$1, 1, 2, 5, 29, \ldots$$
  • $$1,2,\frac32,\frac74,\frac{13}{8},\ldots$$
  • $$1, 1, 2, 9, 737, \ldots$$
  • $$1,2,\sqrt{2},\sqrt[4]{8},\sqrt[8]{32},\ldots$$
  • $$1,2,\frac{1}{\sqrt{2}},2\sqrt[4]{2},\frac{1}{\sqrt{4\sqrt[4]{2}}},\ldots$$
  • 11-20. Найдите значение функции для любых целых неотрицательных аргументов.

  • $$F(n,m)= \begin{cases} 1,\text{ если }n=0,\\ -1,\text{ если }n<m,\\ 2F(n-1,m)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} 1,\text{ если }n=2,\\ m,\text{ если }n-\text{нечетно},\\ F\left(\frac{n}{2}+1,m+n\right)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} m,\text{ если }n=0,\\ n,\text{ если }m=0,\\ F(n-1,m)+F(n,m-1)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} \frac{n}{2},\text{ если }n-\text{четно},\\ m,\text{ если }n=1,\\ F\left(\frac{n+1}{2},m+1\right)\text{ в остальных случаях}. \end{cases} $$
  • $$F(n,m)= \begin{cases} \min(n,m),\text{ если }(n+m)-\text{нечетно},\\ F\left(\frac{n+m}{2},m\right)+F\left(n,\frac{n+m}{2}\right)\text{ в остальных случаях}. \end{cases} $$
  • $$F(m,n)= \begin{cases} F(0,n)=n+1,\\ F(m,0)=F(m-1,1),\text{ если }m>0,\\ F(m,n)=F(m-1,F(m,n-1))\text{ если }m,n>0. \end{cases} $$
  • $$F(n,m)= \begin{cases} \max(n,m),\text{ если }(n+m)-\text{четна}\\ F\left(\frac{n+m+1}{2},m\right)+F\left(n,\frac{n+m+1}{2}\right)\text{ в остальных случаях }. \end{cases} $$
  • $$F(n,m)= \begin{cases} \min(n+m,m\cdot n),\text{ если }(n\cdot m)-\text{нечетно}\\ F\left(\frac{n\cdot m}{2},m\right)+F\left(n,\frac{n\cdot m}{2}\right)\text{ в остальных случаях }. \end{cases} $$
  • $$F(m,n)= \begin{cases} n+2,\text{ если } m=0,\\ F(m-1,1),\text{ если } n=0,m>0,\\ F(m-1,F(m,n-1))\text{ в остальных случаях }. \end{cases} $$
  • $$F(m,n)= \begin{cases} n+1,\text{ если } m=0,\text{ или } n=0,\\ F(m-1,F(m,n-1))\text{ в остальных случаях }. \end{cases} $$
  • 21-28. Составьте рекурсивную функцию для решения задачи.

  • Найдите сумму всех трехзначных чисел, кратных 25.
  • Переведите натуральное число $$N$$ в восьмеричную систему счисления.
  • Найдите $$n$$ -ый член геометрической прогрессии, заданной первым членом и знаменателем.
  • Найдите сумму первых $$n$$ четных натуральных чисел
  • Найдите $$n$$ -ый член арифметической прогрессии, заданной первым членом и разностью.
  • Найдите сумму первых $$n$$ натуральных чисел, оканчивающихся цифрой 5.
  • Функция определена на полуинтервале $$[0; 2)$$ следующим образом: $$f(x)=\sqrt{4-x^2}.$$ Выполните ее периодическое продолжение на множество действительных чисел. Найдите значение полученной функции для данного $$x$$.
  • Переведите натуральное число $$N$$ в двоичную систему счисления.
  • Задание 10. Алгоритмы обработки данных

    1. Закраска прямой. На числовой прямой окрасили $$N$$ отрезков. Известны координаты левого и правого концов каждого отрезка ( $$L_i$$ и $$R_i$$ ). Найти длину окрашенной части числовой прямой.

    Ограничения: $$L_i$$ и $$R_i$$ – целые, $$-1 000 000 000 \leq L_i \leq R_i \leq 1 000 000 000$$, $$1 \leq N \leq 15 000$$, время 1 с.

    Ввод из файла cover.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – пары $$L_i$$ и $$R_i$$.

    Вывод в файл cover.out. Вывести одно число – длину окрашенной части прямой.

    Примеры

    2. Сумма произведений. Дан набор переменных $$х_1, х_2, \ldots , x_N$$. Каждая переменная $$х_i$$ может принимать значение только -1, 0 или +1. Для данного целого числа $$S$$ требуется определить количество способов присвоить переменным $$х_i$$ значения так, чтобы сумма всех возможных произведений $$хi хj$$ была равна $$S$$, где $$i < j$$ и $$i, j = 1, 2, \ldots, N$$. Два способа считаются различными, если они содержат различное число $$х_i = 0$$.

    Ограничения: $$2 \leq N \leq 10 000$$, $$-10 000 \leq S \leq 10 000$$, время 1 с.

    Ввод из файла prodsum.in. В первой строке находятся числа $$N$$ и $$S$$, разделенные пробелом.

    Вывод в файл prodsum.out. Вывести одно целое число – количество способов представить $$S$$ как сумму произведений.

    Примеры

    3. Статическая сложность. Анализ временной сложности алгоритмов – важный инструмент создания эффективных программ. Алгоритмы, выполняемые за линейное время, как правило, значительно быстрее алгоритмов, требующих для выполнения той же задачи квадратичного времени, так что предпочтение должно быть отдано первым.

    Обычно определяют время выполнения алгоритма по отношению к $$n$$ – "размеру" входных данных. Это может быть число объектов, которые нужно отсортировать, число точек многоугольника и т.п. Поскольку определение формулы зависимости временной сложности алгоритма от $$n$$ – непростая задача, было бы замечательно, если бы ее можно было автоматизировать. К сожалению, в общем случае это невозможно. Но в этой задаче мы будем рассматривать программы очень простой природы, над которыми это можно проделать. Рассматриваемые программы записаны согласно следующим правилам БНФ, где <число> может быть любым неотрицательным целым числом:

    <Программа> : := "BEGIN" <Список операторов> "END" 
    <Список операторов>::=<Оператор>|<Оператор><Список операторов> 
    <Оператор> ::=<Оператор LOOP> | <Оператор 0P> 
    <Оператор LOOP> ::=<Заголовок ЮОР><Список операторов>"END" 
    <Заголовок LOOP> : := "LOOP" <число> | "LOOP n" 
    <Оператор OP> : := "OP" <число>

    Время выполнения такой программы может быть вычислено следующим образом: выполнение оператора ОР требует столько единиц времени, сколько указано в его параметре. Список операторов, заключенный в оператор LOOP, выполняется столько раз, сколько указано в параметре оператора, то есть или заданное константное число раз, если задано число, или $$n$$ раз, если параметром является $$n$$. Время выполнения списка операторов равно сумме времени выполнения его частей. Таким образом, время выполнения программы в целом зависит от $$n$$.

    Ввод из файла icomplex.in. В первой строке находится целое число $$k$$ — число программ во входном файле. Затем идут $$k$$ программ, удовлетворяющих приведенной грамматике. Пробелы и переводы строк могут встречаться везде в программе, но не в ключевых словах BEGIN, END, LOOP и OP, нет их и в целых числах.

    Вывод в файл icomplex.out Для каждой программы сначала идет строка с номером программы. В следующей строке записывается время работы программы в терминах $$n$$ – многочлен степени не более 10. Многочлен должен быть записан обычным способом, то есть подобные слагаемые должны быть приведены, слагаемое большей степени должно предшествовать слагаемому меньшей степени, слагаемые с коэффициентом 0 не записываются, множители 1 не записываются. Общий вид второй строки " Runtime = a*n^10+b*n^9+...+i*n^2+j*n+k ". Если время выполнения нулевое, нужно вывести " Runtime = 0 ". За строкой с многочленом должна следовать пустая строка.

    Ограничения: вложенность операторов LOOP не превышает 10, размер входного файла не более 2 Кбайт, коэффициенты многочлена в ответе не превышают 50 000, время 1 с.

    Пример

    4. Строки Фибоначчи. Строку Фибоначчи $$F(K)$$ для натуральных чисел $$K$$ определим так: $$F(1) ='A', F(2) ='В', F(K) = F(K – 1) + F(K – 2)$$ при $$K > 2$$, где "+" означает конкатенацию строк. Требуется найти количество вхождений строки $$S$$, состоящей из символов $$А$$ и $$В$$, в строку Фибоначчи $$F(N)$$.

    Ограничения: Длина строки $$S$$ составляет от 1 до 25 символов, $$1 \leq N \leq 45$$, время 1 с.

    Примечание. Длина $$F(45)$$ равна 1 134 903 170.

    Ввод из файла fibostr.in. В первой строке содержится число $$N$$, во второй – строка $$S$$.

    Вывод в файл fibostr.out. Вывести одно число – количество вхождений строки $$S$$ в строку Фибоначчи $$F(N)$$.

    Примеры

    5. Анти-QuickSort. Для сортировки последовательности чисел широко используется быстрая сортировка – QuickSort. Оценивать время работы алгоритма будем количеством сравнений с элементами массива (то есть суммарным количеством сравнений в первом и втором while ). Требуется написать программу, генерирующую тест, на котором быстрая сортировка сделает наибольшее число таких сравнений.

    Ввод из файла antiqs.in. В первой строке находится единственное число $$N$$.

    Ограничения: $$1 \leq N \leq 70 000$$, время 1 с.

    Вывод в файл antiqs.out. Вывести перестановку чисел от 1 до $$N$$, на которой быстрая сортировка выполнит максимальное число сравнений. Если таких перестановок несколько, вывести любую из них.

    Пример

    6. Путь коня. Дана шахматная доска, состоящая из $$N\times N$$ клеток; несколько из них вырезано. Провести ходом коня через невырезанные клетки путь минимальной длины из одной заданной клетки в другую.

    Ограничения: $$2 \leq N \leq 50$$, время 1 с.

    Ввод из файла knightw.in. В первой строке задано число $$N$$. В следующих $$N$$ строках содержится по $$N$$ символов. Символом # обозначена вырезанная клетка, точкой – невырезанная клетка, @ — заданные клетки (таких символов два).

    Вывод в файл knightw.out. Если путь построить невозможно, вывести "Impossible", в противном случае вывести такую же карту, как и на входе, но пометить все промежуточные положения коня символом @.

    Примеры

    7. Грядки. Прямоугольный садовый участок шириной $$N$$ и длиной $$М$$ метров разбит на квадраты со стороной 1 м. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям:

  • из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону;
  • никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается).
  • Подсчитайте количество грядок на садовом участке.

    Ограничения: $$1 \leq N, M \leq 200$$, время 1 с.

    Ввод из файла beds.in. В первой строке находятся числа $$N$$ и $$М$$ через пробел, далее идут $$N$$ строк по $$М$$ символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов в исходном файле нет.

    Вывод в файл beds.out. Вывести одно число – количество грядок на садовом участке.

    Пример

    8. Упорядоченные дроби. Вывести в порядке возрастания все несократимые дроби, заключенные между 0 и 1, знаменатели которых не превышают $$N$$.

    Ограничения: $$2 \leq N \leq 255$$, время 1 с.

    Ввод из файла ordfrac.in. В первой строке находится единственное число $$N$$.

    Вывод в файл ordfrac.out. В каждой строке выводится дробь.

    Пример

    9. Сообщение. В сообщении, состоящем из одних русских букв и пробелов, каждую букву заменили ее порядковым номером в русском алфавите (А – 1, Б – 2, ... , Я – 33), а пробел – нулем. Требуется по заданной последовательности цифр найти количество исходных сообщений, из которых она могла получиться.

    Ограничения: цифр не более 100, время 1 с.

    Ввод из файла message.in. В первой строке содержится последовательность цифр.

    Вывод в файл message.out. Вывести одно число.

    Пример

    10. Умножение многочленов. Ввести в символьной форме два многочлена от х с целыми коэффициентами и вывести их произведение в порядке убывания степеней – также в символьной форме.

    Ограничения: степень исходных многочленов не более 10, коэффициенты исходных многочленов по модулю не более 104, время 1 с.

    Ввод из файла polymul.in. В двух строках находятся многочлены.

    Вывод в файл polymul.out. В единственной строке выводится многочлен.

    Примеры

    11. Гомер Симпсон. Обеденный перерыв Гомера Симпсона составляет $$T$$ мс. Один гамбургер Гомер съедает за $$N$$ мс, один чизбургер — за $$M$$. Требуется найти максимальное суммарное число гамбургеров и чизбургеров, которые Гомер может съесть в течение обеденного перерыва.

    Ограничения: $$1 \leq M, N, T \leq 1 000 000$$, все числа целые, время 2 с.

    Ввод из файла homer.in. В первой строке находятся три числа – $$M$$, $$N$$ и $$T$$, разделенные пробелами.

    Вывод в файл homer.out. Вывести максимальное суммарное число гамбургеров и чизбургеров. Если остается какое-то время, требуется указать его через пробел. Предпочтителен вариант, когда дополнительного времени остается как можно меньше.

    Примеры

    12. Диалог компьютеров. Три компьютера соединены сетью. Один из них – сервер, два других – клиенты. На сервере есть несколько файлов. Полные имена файлов, состоящие из двух частей (имя и расширение), различны. Оба клиента знают полные имена всех файлов, находящихся на сервере. Сервер выбирает один из своих файлов и посылает его имя одному из клиентов, а расширение – второму.

    Затем клиенты начинают общаться друг с другом, пытаясь определить, какой файл был выбран сервером (они хотят узнать полное имя файла). Однако клиенты вынуждены общаться очень ограниченным способом. Они по очереди посылают сообщения друг другу, но могут сказать только, что не знают полного имени файла. Если клиент не знает полного имени выбранного файла, он может послать другому клиенту сообщение, говорящее: "Я не знаю полного имени файла". Клиенты чередуются, посылая только это сообщение туда и обратно. Так продолжается до тех пор, пока один из клиентов не узнает полное имя файла или они не решат закончить диалог. Клиент, получивший первую часть полного имени файла, всегда ждет, что второй клиент пошлет первое сообщение.

    Пусть вы знаете все полные имена файлов, находящихся на сервере, и слушаете разговор клиентов. Основываясь на этой беседе, вы должны определить набор файлов, которые могли быть выбраны сервером. Файлы в этом наборе называются файлами-кандидатами.

    Ввод из файла dialogue.in. В первой строке находятся два целых числа, $$N$$ и $$M$$, разделенные пробелом: $$N$$ – число файлов на сервере, $$М$$ – число сообщений, посланных клиентами, пытающимися определить полное имя файла.

    Каждая из следующих $$N$$ строк содержит одно полное имя файла. Полное имя файла дано в стиле, аналогичном формату 8.3 MS-DOS. Каждое полное имя представлено в форме имя.расширение, где и имя, и расширение состоят только из заглавных латинских букв и цифр. Имя всегда имеет от одного до восьми символов. Расширение имеет до трех символов и может быть пусто. Если расширение пусто, разделяющая точка может быть опущена.

    Каждое полное имя файла появляется во входном файле не более одного раза.

    Ограничения: $$1 \leq N \leq 1000, 1 \leq M \leq 100$$, время 3 с.

    Вывод в файл dialogue.out. В первой строке выводится число файлов-кандидатов для данных набора файлов и числа сообщений между клиентами. Выводится 0, если файлы-кандидаты отсутствуют.

    В следующих строках находятся полные имена файлов-кандидатов, каждое в отдельной строке. Они должны идти в том же порядке и в том же написании, что и во входном файле. Это означает, что если разделяющая точка в названии конкретного файла была опущена во входном файле, то она должна быть опущена и в выводе, и наоборот. Файл нельзя упоминать более одного раза.

    Пример

    13. Бросание кубика. Кубик, грани которого помечены цифрами от 1 до 6, бросают $$N$$ раз. Найти вероятность того, что сумма выпавших чисел будет равна $$Q$$.

    Ограничения: $$1 \leq N \leq 500, 1 \leq Q \leq 3000$$, время 1 с.

    Ввод из файла die.in. В первой строке находятся числа $$N$$ и $$Q$$ через пробел.

    Вывод в файл die.out. Выводится единственное вещественное число, которое должно отличаться от истинного значения не более чем на 0,01 истинного значения.

    Примеры

    14. Ближайшее число. Дана матрица $$A$$ размером $$N\times N$$, заполненная неотрицательными целыми числами. Расстояние между двумя элементами $$A_{ij}$$ и $$A_{pq}$$ определено как $$|i – p| + |j – q|$$. Требуется заменить каждый нулевой элемент матрицы ближайшим ненулевым. Если есть две или больше ближайших ненулевых ячейки, нуль должен быть оставлен.

    Ограничения: $$1 \leq N \leq 200, 0 \leq A_{ij} \leq 1 000 000$$, время 3 с.

    Ввод из файла neamum.in. В первой строке содержится число $$N$$. Затем идут $$N$$ строк по $$N$$ чисел, разделенных пробелами и представляющих собой матрицу.

    Вывод в файл neamum.out. Выводится $$N$$ строк по $$N$$ чисел, разделенных пробелами, – модифицированная матрица.

    Пример

    15. Прямоугольное деление. Дано $$N$$ прямоугольников со сторонами, параллельными осям координат. Требуется определить, на сколько частей эти прямоугольники разбивают плоскость (внутри частей не должно быть границ прямоугольников).

    Ввод из файла rectpart.in. В первой строке содержится число прямоугольников $$N$$. Далее идут $$N$$ строк, содержащих по четыре числа, $$x_1 y_1 x_2, y_2$$, – координаты двух противоположных углов прямоугольника.

    Ограничения: $$1 \leq N \leq 100$$, координаты представляют собой целые числа и по абсолютной величине не превосходят 10 000, время 3 с.

    Вывод в файл rectpart.out Вывести одно число – количество частей, на которые разбивается плоскость.

    Пример

    16. Водопровод. Город Восточный постоянно страдает от недостатка воды. Для устранения этой проблемы была построена новая водопроводная труба. Строительство трубы началось с обоих концов одновременно, и спустя некоторое время половины соединились. Ну, почти. Первая половина трубы заканчивалась в точке $$(х_1, у_1)$$, а вторая – в точке $$(x_2, у_2)$$. К сожалению, осталось лишь несколько отрезков трубы различной длины. Более того, из-за специфики местной технологии трубы могут быть проложены только в направлении с севера на юг или с востока на запад и соединяются, образуя или прямую, или угол 90 $$\deg$$. Требуется, зная длины отрезков труб $$L_1, L_2, \ldots, L_K$$ и количество отрезков каждой длины $$C_1, C_2, \ldots, C_K$$, сконструировать трубу, соединяющую две заданные точки, или определить, что это невозможно.

    Ограничения: $$1 \leq K \leq 4, 1 \leq x_1, y_1, x_2, y_2, Li \leq 1000, 1 \leq C_i \leq 10$$, все числа целые, время 3 с.

    Ввод из файла wpipe.in. В первой строке находятся числа $$x_1, y_1, x_2, y_2, K$$, затем $$2K$$ чисел: $$L_1, L_2, \ldots, L_K , C_1, C_2, \ldots, C_K$$.

    Вывод в файл wpipe.out. Вывести одно число — минимальное количество нужных отрезков труб или -1, если соединение невозможно.

    17. Химические реакции. Билл преподает химию в школе, он подготовил несколько тестов для учеников. Каждый тест состоит из химической формулы и нескольких возможных результатов реакции. Среди этих результатов ученики должны выбрать правильный. Билл хочет убедиться в том, что, вводя свои тесты в компьютер, он не допустил опечаток, благодаря которым ученики могли бы отбросить неверные ответы, просто подсчитав число химических элементов в левой и правой частях уравнения (в правильном уравнении химической реакции должно соблюдаться равенство).

    Ваша задача - написать программу, которая поможет Биллу. Программа должна прочитать описание теста, состоящее из заданной левой части уравнения и нескольких возможных правых частей, и определить, равно ли количество химических элементов в каждой предложенной правой части уравнения количеству химических элементов в заданной левой части.

    Билл формализовал задачу. И левая, и правая части уравнения представлены строкой символов без пробелов, состоящей из одной или более химических последовательностей, разделенных знаком плюс. Каждая последовательность имеет необязательный предшествующий целый множитель, относящийся ко всей последовательности, и несколько элементов. Каждый элемент может сопровождаться необязательным целым множителем, относящимся к нему. Элемент в этом уравнении может быть или отдельным химическим элементом, или целой последовательностью в круглых скобках. Каждый отдельный химический элемент представлен или одной прописной буквой, или прописной буквой, сопровождаемой строчной.

    Еще более формально, используя нотацию, аналогичную форме Бэкуса-Наура, можно написать:

    <формула>::=[<число>]<последовательность>{"+"[<число>]<последовательность>}
    <последовательность>::=<элемент>[<число>]{<элемент>[<число>]} 
    <элемент>::=<химический элемент>|"("<последовательность>")" 
    <химический элемент>::=<прописная буква>[<строчная буква>] 
    <прописная 6уква>::= "А".."Z" 
    <строчная буква>::= "а".."z" 
    <число>::= "1". ."9" {"0". ."9"}

    Будем говорить, что каждый отдельный химический элемент встречается в формуле всего $$X$$ раз, если $$X$$ – сумма всех различных вхождений этого химического элемента, умноженных на все числа, относящиеся к ним. Например, в формуле

    C2H5OH+3O2+3(SiO2)
  • C встречается всего 2 раза;
  • H встречается всего 6 раз (5 + 1);
  • 0 встречается всего 13 раз (1 + 3 * 2 +3 * 2);
  • Si встречается всего 3 раза.
  • Все множители в формулах – целые числа не меньше 2, если заданы явно, или равны 1 – по умолчанию.

    Ввод из файла chem.in. В первой строке находится формула — левая часть уравнения, во второй – одно число $$N$$ – количество рассматриваемых правых частей, в каждой из следующих $$N$$ строк – одна формула – предлагаемая правая часть уравнения.

    Ограничения: $$1 \leq N \leq 10$$, длина формулы не превосходит 100 символов, каждый

    Вывод в файл chem.out. Для каждой из $$N$$ заданных правых частей выведите одну строку вида

    <формула левой части>!=<формула правой части>

    Здесь <формула левой части> должна быть замещена посимвольной копией формулы левой части, как она дана в первой строке входного файла, а <формула правой части> – замещена точной копией формулы правой части, как она дана во входном файле. В строках не должно быть пробелов.

    Пример

    18. Суммы. Дано $$N$$ целых чисел $$A_1, A_2,\ldots, A_N$$. Требуется найти количество различных значений сумм вида $$k_{1A1} + k_{2A2} + k_NA_N$$.

    Ограничения: $$1 \leq N \leq 500, 0 \leq A_i \leq 100, 0 \leq k_i \leq 1$$, все числа целые, время 2 с.

    Ввод из файла sums.in. В первой строке находится число $$N$$, во второй – $$A_1, A_2,\ldots, A_N$$.через пробел.

    Вывод в файл sums.out. Вывести одно число – количество различных значений сумм.

    Примеры

    19. Lines. В таблице из $$N$$ строк и $$N$$ столбцов некоторые клетки заняты шариками, другие свободны. Выбран шарик, который нужно переместить, и место, куда его нужно переместить. Выбранный шарик за один шаг перемещается в соседнюю по горизонтали или вертикали свободную клетку. Требуется выяснить, возможно ли переместить шарик из начальной клетки в заданную, и если возможно, то найти путь из наименьшего количества шагов.

    Ограничения: $$2 \leq N \leq 40$$, время 1 с.

    Ввод из файла lihes.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – по $$N$$ символов. Символом точки обозначена свободная клетка, латинской заглавной $$0$$ – шарик, @ – исходное положение шарика, который должен двигаться, латинской заглавной $$X$$ — конечное положение шарика.

    Вывод в файл lihes.out. В первой строке выводится $$Y$$, если движение возможно, или $$N$$, если нет. Если движение возможно, далее следует $$N$$ строк по $$N$$ символов – как и на вводе, но буква $$X$$, а также все точки по пути заменяются плюсами.

    Примеры

    20. Покраска лабиринта. Лабиринт представляет собой квадрат, состоящий из $$N\times N$$ сегментов. Каждый из сегментов может быть либо пустым, либо заполненным камнем. Гарантируется, что левый верхний и правый нижний сегменты пусты. Лабиринт обнесен сверху, снизу, слева и справа стенами, оставляющими свободными только левый верхний и правый нижний углы. Директор лабиринта решил покрасить стены лабиринта, видимые изнутри (рис.). Помогите ему рассчитать количество краски, необходимой для этого.

    Ограничения: $$3 \leq N \leq 33$$, размер сегмента 3 x 3 м, высота стен 3 м, время 1 с.

    Ввод из файла paintlab.in. В первой строке находится число $$N$$, затем идут $$N$$ строк по $$N$$ символов: точка обозначает пустой сегмент, решетка – сегмент со стеной.

    Вывод в файл paintlab.out. Вывести одно число – площадь видимой части внутренних стен лабиринта в квадратных метрах.

    21. Поле для крикета. Жил-был жадный Король. Он приказал своему главному Архитектору построить поле для королевского крикета в парке. Король был таким жадным, что не послушал предложения своего Архитектора построить поле прямо в центре парка и окружить его живописным бордюром деревьев, специально посаженных вокруг. Вместо этого он приказал не срубать деревья и не сажать новых, но построить самое большое поле для крикета, какое только можно. Если Король обнаружит, что Архитектор посмел тронуть даже единственное дерево в парке или спроектировал меньшее поле, чем было возможно, Архитектор лишится головы. Более того, он потребовал от Архитектора представить план поля, где указаны его точное положение и размер.

    Ваша задача – помочь бедному Архитектору сохранить голову, написав программу, которая найдет максимальный размер поля для крикета и его положение внутри парка, удовлетворяющие требованиям Короля.

    Задача слегка упрощена тем, что парк Короля имеет прямоугольную форму и расположен на плоской поверхности. Более того, границы парка параллельны направлениям север – юг и восток – запад. В то же время игра в королевский крикет всегда происходит на квадратном поле, границы которого также параллельны направлениям север – юг и восток – запад. Архитектор уже сопоставил парку прямоугольную декартову систему координат и точно определил координаты каждого дерева.

    Оси этой системы координат, конечно, параллельны направлениям север – юг и восток – запад. Юго-западный угол парка имеет координаты (0, 0), а северо-восточный – координаты $$(W, H)$$, где $$W$$ и $$Н$$ – длина и ширина парка соответственно (рис.).

    В этой задаче вы можете пренебречь диаметром деревьев. Деревья не могут находиться внутри поля для крикета, но могут располагаться на его сторонах. Поле для крикета может также касаться границы парка, но не должно лежать вне парка.

    Ввод из файла cricket.in. Первая строка содержит три целых числа, $$N$$, $$W$$ и $$H$$, разделенных пробелами: $$N$$ — число деревьев в парке, $$W$$ и $$H$$ – длина и ширина парка соответственно.

    Следующие $$N$$ строк описывают координаты деревьев в парке. Каждая строка содержит два целых числа $$x_i$$ и $$y_i$$ разделенных пробелом и представляющих собой координаты $$i$$ -го дерева. Все деревья имеют различные координаты.

    Ограничения: $$1 \leq N \leq 100, 1 \leq W, H \leq 10 000, 0 \leq x_i \leq W, 0 \leq y_i \leq H$$, время 1 с.

    Вывод в файл cricket.out. Вывести через пробел три целых числа, $$P$$, $$Q$$ и $$L$$, где $$(P, Q)$$ – координаты юго-западного угла поля для крикета, $$L$$ – длина его сторон. Если существует несколько возможных положений поля максимального размера, вывести любое.

    Пример

    22. Электронная таблица. Напишите программу, выполняющую функции очень простой электронной таблицы. Она работает с таблицей из 9 строк от 1 до 9 и 26 столбцов от А до Z. Клетки таблицы обозначаются именами, составленными из кодов столбца и строки, например B1, S8.

    Каждая клетка содержит выражение. Выражения используют целые константы, ссылки на клетки, скобки, бинарные операторы +, -, * и / (целочисленное деление).

    Так, 567, E8/2, (3+B3)*(C4-l) являются правильными выражениями. Все операторы целочисленные. Деление на ноль дает в результате ноль.

    Если значение ячейки, на которую ссылается некоторое выражение, не определено, оно считается равным нулю. Ситуация, когда две или более ячейки зависят друг от друга, является отдельным случаем – циклической ссылкой.

    Ограничения: длина выражения в одной ячейке до 255 символов, все аргументы и результаты меньше 1 000 000, время 1 с.

    Ввод из файла sprsheet.in. Первая строка содержит число выражений $$N$$. Следующие N строк имеют формат <Имя клетки>=<выражение>. Все выражения корректные, и каждая ячейка определена не более чем одним выражением.

    Вывод в файл sprsheet.out. В единственной строке выводится или значение клетки A1, или число 1000000 (один миллион), если значение клетки A1 не может быть найдено из-за циклической ссылки.

    Пример

    23. Путь спелеолога. Пещера представлена кубом, разбитым на $$N$$ частей по каждому измерению (то есть на $$N^3$$ кубических клеток). Каждая клетка может быть или пустой, или полностью заполненной камнем. Исходя из положения спелеолога в пещере, требуется найти, какое минимальное количество перемещений по клеткам ему требуется, чтобы выбраться на поверхность. Переходить из клетки в клетку можно, только если они обе свободны и имеют общую грань.

    Ограничения: $$1 \leq N \leq 30$$, время 1 с.

    Ввод из файла speleo.in. В первой строке содержится число $$N$$. Далее следует $$N$$ блоков. Блок состоит из пустой строки и $$N$$ строк по $$N$$ символов: # обозначает клетку, заполненную камнями, точка – свободную клетку. Начальное положение спелеолога обозначено заглавной буквой $$S$$. Первый блок представляет верхний уровень пещеры, достижение любой свободной его клетки означает выход на поверхность. Выход на поверхность всегда возможен.

    Вывод в файл speleo.out. Вывести одно число – длину пути до поверхности.

    Пример

    Комментарий

    Нужно спуститься на уровень вниз, сделать два движения на запад, подняться на уровень вверх, сделать движение на юг, подняться на уровень вверх.

    24. Дырявая ткань. На столе лежат несколько кусков ткани, не перекрывая друг друга. Эти куски могут иметь дыры, в том числе и настолько большие, что в них может поместиться целый кусок ткани. Был получен черно-белый образ поверхности стола, на котором области, покрытые тканью, представлены символами *, а свободные площади – точками. Один кусок ткани, таким образом, представлен 4-связной областью символов *, то есть группой *, соседствующих друг с другом горизонтально или вертикально, но не по диагонали.

    На схеме три куска – один без дыр, а два – с одной дырой каждый: первый – площадью 8, второй – площадью 12.

    Ваша цель – найти кусок с наибольшим количеством дыр в нем. Дыра – это 4-связная область точек, полностью окруженных символами *. Если несколько кусков имеют одинаковое количество дыр, нужно выбрать кусок минимальной площади.

    Ввод из файла holey.in. В первой строке содержатся два числа $$W$$ и $$H$$, разделенные пробелами. Следующие $$H$$ строк содержат по $$W$$ символов каждая. Символы в этих строках – или * (ASCII 42), или точка (ASCII 46).

    Ограничения: $$1 \leq W, H \leq 100$$, время 1 с.

    Вывод в файл holey.out. Вывести одно целое число – площадь минимального из наиболее дырявых кусков. Если нет кусков с дырами, выходной файл должен содержать ноль.

    Пример

    25. Несоставляемое число. Даны $$N$$ натуральных чисел. Найти минимальное натуральное число, не представимое суммой никаких из этих чисел, если в эту сумму каждое исходное число может входить не более одного раза.

    Ограничения: $$1 \leq N \leq 10 000$$, значения исходных чисел от 1 до 1 000 000 000, время 1 с.

    Ввод из файла nosum.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – по одному натуральному числу.

    Вывод в файл nosum.out. Вывести одно число.

    Примеры

    26. SMS. Сообщения SMS сотового телефона MOBILA (рис.) составлены из прописных латинских букв. Если буква первая на кнопке, нужно нажать эту кнопку один раз, чтобы добавить букву в сообщение. Если буква вторая — нужно нажать кнопку дважды и т. д. Так, чтобы набрать слово "SMS", нужно нажать

    (PQRS)(PQRS)(PQRS)(PQRS)(MNO)(PQRS)(PQRS)(PQRS)(PQRS)

    Чтобы ввести две буквы, находящиеся на одной кнопке, нужно между нажатиями клавиши сделать паузу. Например, чтобы ввести сообщение "АА", нужно нажать (АВС)(пауза)(АВС)

    Если на кнопке три буквы, то, как только такая кнопка нажата три раза, последняя буква добавляется в сообщение немедленно, а следующие нажатия той же кнопки относятся к следующей букве сообщения. Аналогично, если на кнопке четыре буквы, то после четырех нажатий в сообщение будет добавлена последняя буква. То есть последовательность нажатий

    (АВС)(АВС)(АВС)(АВС)(пауза)(АВС)

    соответствует сообщению "САА". К сожалению, сотовые телефоны этой модели давно не производятся, и остался только один такой телефон. Он может произвольно вставлять и игнорировать паузы во время ввода сообщения, что может привести к некоторым изменениям в сообщениях. Например, введя MOSCOWQUARTERFINAL, можно получить вместо этого OMSCMNWQTTARTERPDEINAL. Вы получили SMS-сообщение и знаете, что оригинальное сообщение содержало $$N$$ букв.

    Чтобы определить вероятность угадывания оригинального сообщения, найдите число возможных сообщений, которые могли превратиться в то, которое вы получили.

    Ограничения: $$1 \leq N \leq 80$$, полученное сообщение состоит только из прописных латинских букв, длина полученного сообщения – от 1 до 80 букв, время 2 с.

    Ввод из файла sms.in. В первой строке задана длина оригинального сообщения $$N$$. Вторая строка содержит полученное SMS-сообщение.

    Вывод в файл sms.out. Вывести число сообщений из $$N$$ букв, которые, будучи набранными на этом телефоне, могут превратиться в данное сообщение.

    Примеры

    27. Lines. В таблице из $$N$$ строк и $$N$$ столбцов некоторые клетки заняты шариками, другие свободны. Выбран шарик, который нужно переместить, и место, куда его нужно переместить. Выбранный шарик за один шаг перемещается в соседнюю по горизонтали или вертикали свободную клетку. Требуется выяснить, возможно ли переместить шарик из начальной клетки в заданную, и если возможно, то найти путь из наименьшего количества шагов.

    Ограничения: $$2 \leq N \leq 250$$, время 1 с.

    Ввод из файла lines2.in. В первой строке находится число $$N$$, в следующих $$N$$ строках – по $$N$$ символов. Символом точки обозначена свободная клетка, латинской заглавной 0 — шарик, @ — исходное положение шарика, который должен двигаться, латинской заглавной $$X$$ — конечное положение шарика.

    Вывод в файл lines2.out. В первой строке выводится $$Y$$, если движение возможно, или $$N$$, если нет. Если движение возможно, далее следует $$N$$ строк по $$N$$ символов – как и на вводе, но $$X$$, а также все точки по пути заменяются плюсами.

    Примеры

    28. Удаление клеток. Из прямоугольного листа клетчатой бумаги ( $$М$$ строк, $$N$$ столбцов) удалили некоторые клетки. На сколько кусков распадется оставшаяся часть листа? Две клетки не распадаются, если они имеют общую сторону.

    Ограничения: $$1 \leq M, N \leq 100$$, время 1 с.

    Ввод из файла remsquar.in. В первой строке находятся числа $$M$$ и $$N$$, в следующих $$М$$ строках – по $$N$$ символов. Если клетка не была вырезана, этому соответствует знак #, если вырезана – точка.

    Вывод в файл remsquar.out. Вывести одно число.

    Пример

    Вернуться к учебному плану