Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2020, 15:29   #1
Usernameistaken
 
Регистрация: 18.11.2020
Сообщений: 6
По умолчанию Как решить задание?

Помогите пожалуйста решить задание.
В поселке, где N домов, расположенных вдоль прямой дороги с одной стороны на равных расстояниях, прокладывают телефонную связь. Задать количество телефонных аппаратов в каждом доме. Каждый телефон должен быть соединен с АТС отдельным кабелем. Определить, в каком доме необходимо установить АТС, чтобы суммарная длина кабелей была минимальной.
Usernameistaken вне форума Ответить с цитированием
Старый 14.12.2020, 21:24   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Ставишь АТС в средний дом, считаешь длины, имея в виду число аппаратов. Потом на один дом ближе к началу. Если стало меньше, продолжаешь в том же духе, пока не станет больше. Если уже в первой попытке было больше, то считаешь таким же образом в другую сторону. И выходишь на оптимум.
Или тупо в лоб, полным перебором: с первого по последний.
Простейшая задача дискретной оптимизации.
digitalis вне форума Ответить с цитированием
Старый 15.12.2020, 09:12   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
равные расстояния
дом в котором разница в числе аппаратов слева и справа будет минимальна. ???
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.12.2020, 11:40   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

... с одной поправкой: учитывать не только число аппаратов, но и удалённость от АТС.
Вот решение (тупо, в лоб, полным перебором):
Код:
procedure TForm1.Button3Click(Sender: TObject);
var i,j,le,ri,mn,imn,sum: integer ; A: array [0..50] of integer ;
st: string ;
begin
   st := '' ;
   for i := 0 to 50 do
      begin
       A[i] := random (20) + 1 ;
       st := st + Format ('%4d',[A[i]])
      end;
   Memo1.Lines.Add(st) ;
   mn := 1000000 ;
   for i := 0 to 50 do
      begin
        le := 0 ;
        for j := 0 to i-1 do le := le + A[j] * Abs(i-j) ;
        ri := 0 ;
        for j := i+1 to 50 do ri := ri + A[j] * Abs(i-j) ;
        sum := le + ri ;
        if sum < mn then
           begin mn := sum ; imn := i end ;
        st := Format('%3d %3d %5d %5d %5d %5d',[i,A[i],le,ri,le-ri,sum]) ;
        Memo1.Lines.Add(st) ;
      end ;
   Memo1.Lines.Add(Format('%4d = %4d',[imn,mn])) ;
end;
......
23 1 3222 3691 -469 6913
24 10 3468 3439 29 6907
25 2 3724 3197 527 6921
......
24 = 6907

Последний раз редактировалось digitalis; 15.12.2020 в 12:17.
digitalis вне форума Ответить с цитированием
Старый 15.12.2020, 23:45   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Что-то уж больно сложно
Если в посёлке n домов на расстоянии dL друг от друга, в каждом доме ki аппаратов и АТС в доме с номером m, то можно записать:
Код:
d1 = k1*(m - 1)*dL  {для первого дома}
d2 = k2*(m - 1)*dL  {для второго дома}
...
dn = kn*(m - n)*dL  {для n-ого дома}
Суммируем расстояния.
Для домов, чьи номера меньше m - положительные значения, а для домов с номером больше m - отрицательные. Оптимальной будет сумма равная нулю.
Полагаем dL = 1. Тогда:
Код:
(k1 + k2 + ... kn)*m = k1*1 + k2*2 + ... kn*n   {номер дома умножаем на число аппаратов}
Теперь имеем:
Код:
m = (k1*1 + k2*2 + ... kn*n) / (k1 + k2 + ... kn)
Остался вопрос: Так как m - целое число, то при делении округлять в меньшую или большую сторону?
В принципе можно тупо проверить только для двух номеров [m] (меньшее целое) или ]m[ (большее целое.

PS: digitalis А вы можете проверить?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.12.2020, 00:08   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Я так глубоко не вник - ночь, сонливость - но результат, по-моему, всё тот же: полный перебор. Ваш вариант (#3 с моим добавлением) я проверил ( (слева - справа) -> min), оптимум совпадает с моим (#4). Но по-моему, слишком много чести для такой элементарнейшей задачи, чтоб мы её ещё шлифовали до крайности.

Последний раз редактировалось digitalis; 16.12.2020 в 00:31.
digitalis вне форума Ответить с цитированием
Старый 16.12.2020, 00:25   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Цитата:
Ваш вариант я проверил
Спасибо за проверку. Самому пока никак ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решить задание в ПаскальАБС miler Помощь студентам 0 19.12.2016 17:11
помогите решить задание c++ max1993 Помощь студентам 0 11.06.2015 22:27
[c++] Решить задание Safok Помощь студентам 0 26.11.2014 23:18
решить задание Chapik C++ Builder 2 17.09.2012 01:50