- •Занятие 2
- •1.2. Логические операции
- •1.3. Условный оператор и логические операции
- •2. Системы счисления
- •3. Задачи
- •Матч 195, Округление (Rounder) Дивизион 2, Уровень 1
- •Решение
- •Матч 325, Калькулятор зарплаты (SalaryCalculator) Дивизион 2, Уровень 1
- •Решение
- •Матч 311, Убежать из прямоугольника (EscapeFromRectangle) Дивизион 2, Уровень 1
- •Решение
- •Матч 318, Наибольший прямоугольник (BiggestRectangleEasy) Дивизион 2, Уровень 1
- •Решение
- •Указания к решению упражнений
Матч 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, w – x, h – y. Возвращаем наименьшее из этих значений.
#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 |
x y |
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