Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections / lection 2.doc
Скачиваний:
11
Добавлен:
19.03.2015
Размер:
185.34 Кб
Скачать

Матч 311, Убежать из прямоугольника (EscapeFromRectangle) Дивизион 2, Уровень 1

Вы находитесь в точке (x, y) внутри прямоугольника, нижний левый угол которого имеет координаты (0, 0), а правый верхний (w, h). Найти наименьшее расстояние, которое Вам следует преодолеть чтобы достичь границы прямоугольника.

Класс: EscapeFromRectangle

Метод: int shortest(int x, int y, int w, int h)

Ограничения: 2  w, h  1000, 1  x  w-1, 1  y  h-1.

Вход. Целочисленные координаты Вашего положения (x, y) и правой верхней вершины прямоугольника (w, h).

Выход. Наименьшее расстояние, которое следует преодолеть для достижения границы прямоугольника.

Пример входа

x

y

w

h

1

1

5

5

653

375

1000

1000

161

181

762

375

Пример выхода

1

347

161

Решение

Находим расстояния от точки (x, y) до всех четырех сторон прямоугольника, которые соответственно равны x, y, wx, hy. Возвращаем наименьшее из этих значений.

#include <stdio.h>

class EscapeFromRectangle

{

public:

int shortest(int x, int y, int w, int h)

{

int res = x;

if(y < res) res = y;

if(w - x < res) res = w - x;

if(h - y < res) res = h - y;

return res;

}

};

Далее при разборах задач с Топкодера функцию main приводить не будем.

Матч 318, Наибольший прямоугольник (BiggestRectangleEasy) Дивизион 2, Уровень 1

У Джона есть n спичек, каждая из которых имеет длину 1. Он хочет составить из них прямоугольник наибольшей площади. Ломать спички нельзя. Джону не обязательно использовать все спички.

Класс: BiggestRectangleEasy

Метод: int findArea(int n)

Ограничения: 4  n  10000.

Вход. Количество спичек n, которое имеется в наличии у Джона.

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

Пример входа

n

11

5

7254

Пример выхода

6

1

3288782

Решение

Если одна из сторон прямоугольника равна x, то другую можно найти по формуле:

y = (n – 2*x) / 2

Площадь полученного прямоугольника равна S(x) = x * (n – 2*x) / 2. Она будет наибольшей в такой точке x, в которой S’(x) = 0. Имеем: S’(x) = (n – 4*x) / 2 = 0, x = n / 4. То есть искомым прямоугольником будет квадрат.

Если n не делится на 4, то выполняя целочисленные деления, получим правильный результат.

#include <stdio.h>

class BiggestRectangleEasy

{

public:

int findArea(int n)

{

int x = n / 4;

int y = (n - 2 * x) / 2;

return x * y;

}

};

Указания к решению упражнений

Упражнение 2.3. Ответом будет значение выражения , которое на языке Си можно записать в виде (m + n – 1) / n.

Упражнение 2.4. Ответом будет значение выражения , которое на языке Си можно записать в видеm / n.

Упражнение 2.5. Следует выполнить следующие операции:

a = n / 100; b = n / 10 % 10; c = n % 10;

Упражнение 2.6. Таблицы истинности равенства и импликации имеют вид:

x

y

x = y

x

y

xy

0

0

1

0

0

1

0

1

0

0

1

1

1

0

0

1

0

0

1

1

1

1

1

1

Упражнение 1.3.1. Выражение имеет вид:

if ((x == 1) || (x == 3) || (x == 6)) . . .

Упражнение 2.1. 3110 = 111112, 3110 = 378, 3110 = 1F16.

Упражнение 2.2.Ответами будут следующие значения:

а) 22 + 24 = 101002 б) 26 – 1 = 1111112 в) 3 * 82 = 110000002

Соседние файлы в папке Lections