Приезд генерала • Так как на первом месте должен стоять солдат с максимальным ростом, то логично поставить на первое место самого левого солдата с максимальным ростом, чтобы минимизировать время (число обменов). Исходя из таких же соображений на последнее место поставим самого правого солдата с минимальным ростом. Таким образом количество обменов это номер самого левого солдата с максимальным ростом - 1 + n - номер самого правого солдата с минимальным ростом. И если самый левый солдат с максимальным ростом стоит правее самого правого с минимальным ростом, то из этой суммы нужно вычесть один.
Эпическая игра • В этой задаче достаточно было просто промоделировать описанную игру. Искать наибольший общий делитель можно разными способами. • static int NOD(int a, int b) • { • while(a!=0 && b!=0) • { • if (a > b) • a = a % b; • else • b = b % a; • } • return (a+b); • }
Черви • Есть два решения: • Мы можем сделать частичные суммы (sum[i] = a[1] + a[2] +. . . + а[i]), а затем сделать бинарный поиск для каждого запроса, чтобы для каждого запроса q найти результат j со свойствами sum[j – 1]
Валера и трубы • Сначала построим такой обход прямоугольной таблицы, который посещает все его клетки: • Пусть сначала мы стоим клетке (1, 1). Слева направо дойдем до самой правой клетки поля в этой строке, до клетки (1, m). • Перейдем на следующую строку, в ячейку (2, m). Справа налево дойдем до самой левой клетки поля в этой строке, до клетки (2, 1). • Перейдем на следующую строку. Повторим действия из пунктов 1. и 2. до тех пор, пока не посетим все клетки. • После того, как мы построили такой обход, получить ответ не трудно: достаточно первые (k - 1) трубу сформировать из 2 ячеек, а последнюю трубу из оставшихся.
Сильно связный город • Построим матрицу смежности и запустим dfs от каждой вершины. • Если при какой то вершине образовались хотя бы две компоненты связности - ответ No. • Если при всех точках образуют одну компоненту связности, то ответ YES