|
Вопрос # 3 315/ вопрос открыт / |
|
Здравствуйте, Уважаемые Эксперты!
Имеется олимпиадная задача:
Система улиц Нью-Йоркского района Манхэттен весьма интересна. В Манхэттене есть N улиц, идущие с Севера на Юг
(авеню), и M улиц, идущие с Запада на Восток (улицы). Ширина каждого авеню и каждой улицы равна D метров, а длина - L
метров. При этом каждая улица пересекает каждый авеню и не имеет общих точек с другими авеню.
Разумеется, все авеню и все улицы имеют асфальтовое покрытие. На перекрёстках, естественно, асфальт уложен в
один слой. Дорожно-ремонтные службы интересуются, сколько квадратных метров асфальта уложено на все авеню и
улицы.
Пример ввода: 1 1 5 10 Вывода: 75
100 10 23 4560 Вывод: 11007800
Помогите, пожалуйста, решить!
 |
Вопрос задал: Arti (статус: Посетитель)
Вопрос отправлен: 22 октября 2009, 15:03
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Arti!
Если бы улицы не пересекались, то общую площадь посчитать элементарно - (N+M)* (L*D) - кол-во улиц на площадь одной улицы. (у нас все улицы и авеню имеют одну длину). Но на пересечениях надо вычитывать один кусок. Таких кусков будет N * M, а их площать - D*D.
Поэтому сразу получаем формулу
(N+M)* (L*D) - (N*M) * (D*D)
при N = 100 M = 10 D = 23 L = 4560
получаем 11007800
В целях улучшения рассчетов лучше сделать некоторые перестановки и записать формулу так
D*((N+M) * L - N*M*D)
и не по той причине, что будет меньше рассчетов:) Угадайте сами.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 октября 2009, 16:04
|
Ответ #2. Отвечает эксперт: min@y™
Вот тибе мегафункция:
// Расчёт площади асфальта
// M - число авеню
// N - число улиц
// D - ширина каждой
// L - длина каждой
function GetSquare(M, N, D, L: Cardinal): Cardinal;
var
C, W, X, Y: Cardinal;
begin
W:= D * D; // Площадь перекрёстка
C:= M * N; // Кол-во перекрёстков
X:= M * (D * L - N * W); // Площадь всех авеню минус площади перекрёстков
Y:= N * (D * L - M * W); // Площадь всех улиц минус площади перекрёстков
Result:= X + Y + C * W; // Общая площадь
end;
Прога под катом.
Приложение: Переключить в обычный режим- program p3315;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils;
-
-
-
-
-
-
- function GetSquare(M, N, D, L: Cardinal): Cardinal;
- var
- C, W, X, Y: Cardinal;
-
- begin
-
-
-
-
-
- end;
-
- var
- M, N, D, L: Cardinal;
-
- begin
- Write(' Enter the M, N, D, L values: ');
- ReadLn(M, N, D, L);
-
- WriteLn(' Square: ', GetSquare(M, N, D, L));
-
- ReadLn;
- end.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 октября 2009, 16:11
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 22 октября 2009, 15:49; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 22 октября 2009, 15:14 [#1]:
А данные в исходном файле угадать - это отдельная задача?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Arti (статус: Посетитель), 22 октября 2009, 15:49 [#2]:
В смысле?
Формат исходных данных:
1 <= N <= 1000, 1 <= M <= 1000, 1 <= D <= 100, 1 <= L <= 10000, L > MD, L > ND.
|
22 октября 2009, 18:11: Вопрос перемещён из тематического раздела Pascal » Программирование на Pascal в раздел Лабораторный практикум модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|