Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 315

/ вопрос открыт /

Здравствуйте, Уважаемые Эксперты!

Имеется олимпиадная задача:

Система улиц Нью-Йоркского района Манхэттен весьма интересна. В Манхэттене есть N улиц, идущие с Севера на Юг
(авеню), и M улиц, идущие с Запада на Восток (улицы). Ширина каждого авеню и каждой улицы равна D метров, а длина - L
метров. При этом каждая улица пересекает каждый авеню и не имеет общих точек с другими авеню.
Разумеется, все авеню и все улицы имеют асфальтовое покрытие. На перекрёстках, естественно, асфальт уложен в
один слой. Дорожно-ремонтные службы интересуются, сколько квадратных метров асфальта уложено на все авеню и
улицы.

Пример ввода: 1 1 5 10 Вывода: 75
100 10 23 4560 Вывод: 11007800

Помогите, пожалуйста, решить!

Arti Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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;

Прога под катом.

Приложение:
  1. program p3315;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13. function GetSquare(M, N, D, L: Cardinal): Cardinal;
  14. var
  15. C, W, X, Y: Cardinal;
  16.  
  17. begin
  18.  
  19.  
  20.  
  21.  
  22.  
  23. end;
  24.  
  25. var
  26. M, N, D, L: Cardinal;
  27.  
  28. begin
  29. Write(' Enter the M, N, D, L values: ');
  30. ReadLn(M, N, D, L);
  31.  
  32. WriteLn(' Square: ', GetSquare(M, N, D, L));
  33.  
  34. ReadLn;
  35. end.


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 22 октября 2009, 16:11


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 22 октября 2009, 15:49; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 22 октября 2009, 15:14 [#1]:

А данные в исходном файле угадать - это отдельная задача?
Галочка "подтверждения прочтения" - вселенское зло.
Arti

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 в раздел Лабораторный практикум модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.