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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2023, 12:26   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Рекурсия, короче.

Вот только до компа добрался (чтобы убедться в несостоятельности своих предидущих решений)))
Sibedir вне форума Ответить с цитированием
Старый 22.03.2023, 12:48   #12
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

возможная визуализация задачи

https://www.youtube.com/watch?v=cesSFpUl7uI
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 22.03.2023, 13:01   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А вот уже без рекурсии
Код:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// MAIN
int main()
{
    // Ввод данных
    int count;
    cin >> count;
    vector<int> coordinates;
    for (int i = 0; i < count ; i++) {
        int buf;
        cin >> buf;
        coordinates.push_back(buf);
    }
    sort(coordinates.begin(), coordinates.end());

    // Формирование списка связей
    count--;
    vector<int> connections;
    for (int i = 0; i < count ; ++i){
        int L = coordinates[i+1] - coordinates[i];
        connections.push_back(L);
    }

    // Поиск минимальной длины связей
    // (в векторе connections длины отдельных связей меняются на минимальные длины связей от начала до текущего элемента)
    int MinL = connections[0];
    if (count > 1) {
        MinL = connections[0] + connections[1];
        connections[1] = MinL;
    }
    if (count > 2) {
        MinL = connections[0] + connections[2];
        connections[2] = MinL;
    }
    for (int i = 3 ; i < count; i++) {
        if (connections[i-1] < connections[i-2]) {
            MinL = connections[i] + connections[i-1];
        }
        else {
            MinL = connections[i] + connections[i-2];
        }
        connections[i] = MinL;
    }
    // (в итоге последняя ячейка вектора connections соответствует минимальной длине связей от начала до конца)
    
    // Вsвод результата
    cout << "Ответ:" << endl << MinL << endl;

    return 0;
}
Sibedir вне форума Ответить с цитированием
Старый 22.03.2023, 13:37   #14
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Sibedir, но жадный алгоритм все же, по моему, короче
Код:
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// MAIN
int main()
{
    // Ввод данных
    int count;
    cin >> count;
    vector<int> coordinates;
    vector<int> connections;
    for (int i = 0; i < count ; ++i) {
        int buf;
        cin >> buf;
        coordinates.push_back(buf);
        connections.push_back(0);
    }
    int MinL = 0;
    for (int i = 0; i < count; ++i) {
        if (connections[i] != 0) continue;
        int k = -1;
        connections[i]++;
        for (int j = i + 1; j < count; ++j)
            if ((j != i) && (connections[j] == 0) && (k == -1 || abs(coordinates[i] - coordinates[k]) > abs(coordinates[i] - coordinates[j]))) k = j;
        for (int j = 0; j < count; ++j)
            if ((j != i) && (connections[j] != 0) && (k == -1 || abs(coordinates[i] - coordinates[k]) > abs(coordinates[i] - coordinates[j]))) k = j;
        connections[k]++;
        MinL += abs(coordinates[i] - coordinates[k]);
    }
    cout << "Ответ:" << endl << MinL << endl;

    return 0;
}

Последний раз редактировалось macomics; 22.03.2023 в 13:40.
macomics вне форума Ответить с цитированием
Старый 22.03.2023, 13:43   #15
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

macomics, да, короче. Но считает не верно
Цитата:
6
1 2 4 7 9 10
Ответ:
6
https://onlinegdb.com/8QGxOCBc1Z
Sibedir вне форума Ответить с цитированием
Старый 22.03.2023, 18:10   #16
Linok0036
 
Регистрация: 20.03.2023
Сообщений: 4
По умолчанию

Sibedir, Спасибо большое! ❤️
Linok0036 вне форума Ответить с цитированием
Старый 05.04.2023, 11:18   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

решил вернуться.
задача легче решается, если идти от обратного.

0. все столбы соединены.
1. мы не можем разорвать две крайние нити (нарушим связность).
среди прочих выбираем самую длинную. и разрываем.
2. получили ДВЕ полностью связанных меньшей длины (для каждой из них повторяем п.0, 1)
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить общую стоимость всех товаров cleverson1 Помощь студентам 4 20.02.2017 20:33
Выведите номера всех четных элементов массива ANTON66 Общие вопросы Delphi 2 28.11.2015 17:17
Выведите на экран квадраты всех нечетных чисел от 1 до 30 xes66 Паскаль, Turbo Pascal, PascalABC.NET 23 13.12.2013 15:35
Многопоточность.TThread.Инициализац ия нескольких нитей. greenisius C++ Builder 4 16.11.2013 19:49
как считает общую длину текста Loki1993 Помощь студентам 3 10.04.2012 14:13