Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
19 / 19 / 4
Регистрация: 22.03.2009
Сообщений: 57

Найти минимальное подмножество отрезков, объединение которых покрывает заданный отрезок

17.10.2009, 12:23. Показов 6635. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет!

помогите мне решить одну задачу:

написать программу. которая для множества заданных отрезков находит минимальное подмножество отрезков. объединение которых покрывает отрезок S=[0,10000]. число отрезков и координаты их концов заданы на входе. Все координаты целочисленные.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2009, 12:23
Ответы с готовыми решениями:

Массивы: пары соседних членов описывают концы отрезков. Накрывают ли полностью эти отрезки заданный отрезок
Привет всем. Помогите пожалуйста решить вот эти задачки. 1)В случайной последовательности x1,x2,...,x2n – пары соседних членов х2k-1...

Определить минимальное подмножество точек, после удаления которых останутся точки лежащие на одной прямой
Просьба по сути повторяет аналогичную из раздела о Паскале. задано множество точек на плоскости,не лежащих на одной прямой.Определить...

Определить минимальное подмножество точек, после удаления которых останутся точки лежащие на одной прямой
задано множество точек на плоскости,не лежащих на одной прямой.Определить минимальное подмножество точек,после удаления которых останутся...

10
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
17.10.2009, 12:34
ну так ты начни, хотя бы ввод данных сделай. ошибки поправим, алгоритм обсудим
0
19 / 19 / 4
Регистрация: 22.03.2009
Сообщений: 57
17.10.2009, 13:44  [ТС]
вот алгоритм:

покрывайте отрезок S пошагово. двигаясь слева направо. на каждом шаге будет непокрытая часть [x, 10000] . из оставшихся отрезков выбирайте тот, который урежет непокрытую часть до [y, 10000], где "y" максимальное.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.10.2009, 13:58
Приехали.
Во-первых, надо найти длины всех отрезков
(Например: 34, 567, 21, 457, 432, 45, 543, 10,)

Во-вторых, их надо отсортировать по убыванию
(567, 543, 457, 432, 45, 34, 21, 10)

А потом начинай с самого левого члена этой последовательности и сравнивай его с 10000. Если он меньше, то прибавляй следующий член, сумму снова сравнивай с 10000. Одновременно инкременируй счётчик отрезков

Как только сумма станет больше или равной 10000, значит ты нашёл искомые отрезки. Величина счётчика и есть их минимальное число.
Привет.
1
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
17.10.2009, 16:12
пробуем, тестим.
ввод через фаил (в файле только пары (начало и конец) отрезков)
ввод организовал как мне удобно, а не по условию
на вывод отладки можно не заморачиваться, главное это результат
а промежуточный вывод для удобства

const int begDiapason = 0;
const int endDiapason = 100; - границы диапазона

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
#define sizeVec(c) int((c).size())
#define all(c) (c).begin(),(c).end()
 
#define LENGTH(a)  ((*a).first) 
#define BEG(a)  ((*a).second.first) 
#define END(a)  ((*a).second.second)        
 
const int begDiapason = 0;
const int endDiapason = 100;
 
typedef  vector<pair< int, pair<int, int> > > SEGMENT;
int main()
{
    char *file="data.txt";
    int beg, end, counter=0;
    bool flag;
    SEGMENT arrSeg;
    SEGMENT::iterator itt;
 
    ifstream f(file);
    if (!(f.is_open()))  // проверка наличия первого файла с текстом
        cout<<"ERROR: not file "<<file;
    else
        while(!f.eof()) // чтении из файла
        {   
            f>>beg; f>>end;
            arrSeg.push_back(make_pair(end-beg, make_pair(beg, end)));
        }
 
 
    // вывод для отладки
    for (SEGMENT::iterator it=arrSeg.begin(); it<arrSeg.end(); it++)
        cout<<"length:"<<LENGTH(it)<<" beg:"<<BEG(it)<<" end:"<<END(it)<<endl;
    cout<<endl;
 
//  sort(all(arrSeg));  reverse(all(arrSeg));  // можно иначе
 
    beg=begDiapason; 
//  for (itt=arrSeg.begin(); itt<arrSeg.end(); itt++)
//     if (beg>=BEG(itt)) 
//      { beg=END(itt); break; }
// 
//  if(beg!=begDiapason) // если после первого поиска не обнаружен отрезок с begDiapason..Х
//  {
//      cout<<++counter<<". length:"<<LENGTH(itt)<<" beg:"<<BEG(itt)<<" end:"<<END(itt)<<endl;
//      arrSeg.erase(itt);
        
        while (!(arrSeg.empty()))
        {
            // достигли конца диапазона
            if (beg>=endDiapason) break;
            // подравниваем все отрезки под текущую позицию бегунка
            for (SEGMENT::iterator it=arrSeg.begin(); it<arrSeg.end(); it++)
                if (beg>BEG(it))    
                    { BEG(it)=beg; LENGTH(it)=END(it)-BEG(it); }
      // сортируем по убыванию (полезные длины отрезков поменялись)
            sort(all(arrSeg));  reverse(all(arrSeg)); 
 
            // ищем максимальный отрезок начинающийся с позиции бегунка
            flag=false;
            for (itt=arrSeg.begin(); itt<arrSeg.end(); itt++)
                if (beg>=BEG(itt)) 
                { flag=true; break; }
 
            if (flag==false) break;
            // если бегунок на отрезке длиной больше нуля
            // инкрементируем счётчик отрезков и по новой
            if (LENGTH(itt)>0)
            {
                cout<<++counter
                    <<". length:"<<LENGTH(itt)
                    <<" beg:"<<BEG(itt)
                    <<" end:"<<END(itt)<<endl;
                beg=END(itt);
                arrSeg.erase(itt);
            }
            else
                break;
        }
        
        if(beg>=endDiapason)
            cout<<"\nmin number segments: "<<counter;
        else
            cout<<"\nit cannot be done: ";
 
    f.close();  cout << endl;   system("PAUSE");
    return 0;
}
1
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
17.10.2009, 22:37
Как только сумма станет больше или равной 10000, значит ты нашёл искомые отрезки. Величина счётчика и есть их минимальное число.
2kramav: прочитай внимательно условие задачи.

Добавлено через 2 минуты
Если перебирать тупо, то будет очень много вариантов: 2^N, где N - число отрезков.
А вообще эта задача решается методом динамического программирования.
TanT уже должен сообразить как
0
эволюционирую потихоньку
 Аватар для TanT
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
17.10.2009, 22:43
Цитата Сообщение от odip Посмотреть сообщение
TanT уже должен сообразить как
odip, мой код выше. но я не совсем уверен, что это о чём вы мне говорили на другой ветки.
как не прискорбно мне это принимать, но я не совсем понял/оценил предложенный вами вариант.
предлагаю попробовать снова осветить вопрос динамического программирования, что, несомненно, будет полезно всем остальным участникам или прям, не стеснясь, вот так ссылкой на источник отправить меня учить мат.часть.
я даже не обижусь.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
17.10.2009, 23:14
Цитата Сообщение от odip Посмотреть сообщение
2kramav: прочитай внимательно условие задачи.

Добавлено через 2 минуты
Если перебирать тупо, то будет очень много вариантов: 2^N, где N - число отрезков.
А вообще эта задача решается методом динамического программирования.
TanT уже должен сообразить как
А что его читать?
Там вызывает непонимание такая фраза:
"объединение которых покрывает отрезок S=[0,10000]"

Ну, я предположил что речь идёт о

""Сумма длин которых покрывает отрезок S=[0,10000]"
Ну то есть сумма длин которых превышает 10000.

Вот и складываю помаленечку себе.
Теперь о "тупо перебирать"

Не знаю, где Вы увидели два в энной степени, но не у меня, факт.
Мой вариант предполагает n вариантов.
То есть если отрезков 10, то 10 длин рассматриваем и всё. А не 2 в степени 10
Естественно, отсортировав прежде массив этих самых длин.

Задекларирую свой способ как оптимальный.
Кто может предложить лучше- пусть предложит. Только чур, умных рож не делать и пыль в глаза не пускать и завесу из слов непонятных не создавать.
Говорить чисто и честно, дабы дурь каждого была видна, как говорил Пётр Первый.
Короче, Пафнутий, не говори красиво.

На крайняк голимый код.
Но с комментариями.
Привет.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
18.10.2009, 19:14
2kravam:
В условии написано: "число отрезков и координаты их концов заданы на входе".
Если нужна только длина отрезков, то зачем еще координаты концов ?
И зачем тогда указывать что покрыть нужно именно от 0 до 10000 ?
Ты неправильно понял задачу.
Нужно покрывать отрезками, но сами отрезки сдвигать никуда нельзя.
Если отрезок от 100 до 200, то это значит что он покрывает от 100 до 200 и в другое место его не сдвинуть.
Задекларирую свой способ как оптимальный.
Декларируй. Только ты решаешь совсем не ту задачу.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.10.2009, 21:09
Я ничё не понял.
Меня термин покрыть добивает. Не знаю, что он обозначает.
Пусть автор сам решает такие задачи.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
19.10.2009, 12:09
Покрыть - это значит накрыть каждую точку диапазона своим отрезком сверху.
Но отрезки можно класть только на те позиции которые указаны для них.
То есть сдвигать отрезок влево или вправо нельзя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2009, 12:09
Помогаю со студенческими работами здесь

Определить номера элементов матрицы, значения которых попадают в заданный отрезок
Составить программу, определяющую номера элементов матрицы, значения которых попадают в заданный отрезок . Границы отрезка вводятся с...

Найти минимальное подмножество вершин взвешенного графа
Задача о размещении бензоколонок Дан взвешенный граф. Найти такое минимальное подмножество вершин S, чтобы любая вершина графа была бы...

С клавиатуры вводятся два числа задающие отрезок [a, b]. Определить, попадает ли третье число c в заданный отрезок
Tasm 1.4, DosBox

Дано множество отрезков; найти отрезок, середина которого ближе всего к заданной точке
Дано множество отрезков. Среди отрезков, длина которых больше D, найти отрезок, середина которого ближе всего к точке (15, 15).

Дано множество отрезков, найти max объединение
дано множество отрезков.найти max объединение.подскажите плиз алгоритм.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru