Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
BOR1K
14 / 14 / 3
Регистрация: 19.09.2009
Сообщений: 289
1

Соединение отрезков

06.02.2010, 12:22. Просмотров 594. Ответов 3
Метки нет (Все метки)

Дан массив целых чисел x[1]..x[m+n], рассматриваемый как соединение двух его отрезков:
начала x[1]..x[m] длины m и конца x[m+1]..x[m+n] длины n. Не использую дополнительных массивов переставить начало и конец.(число действий порядка m+n);
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2010, 12:22
Ответы с готовыми решениями:

В массиве целых чисел, рассматриваемом как соединение двух его отрезков, переставить начало и конец
задача: дан массив целых чисел рассматриваемый как соединение двух его...

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

Есть ли у кого похожий алгоритм: распределения отрезков разной длины внутри отрезков фиксированной длины?
Народ помогите мне с программой распределения отрезков разной длины внутри...

Дерево отрезков
Добрый день, помогите пож-та решить задачи на с++. Нашел решение (расписаны все...

Пересечение отрезков
Есть 2 отрезка, определенные O1(x1, y1, x2, y2) и O2(x1, y1, x2, y2) Нужно...

3
M128K145
Эксперт JavaЭксперт С++
8327 / 3548 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
06.02.2010, 13:07 2
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
#include <iostream>
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int n, m, i, j;
    int *mas;
    std::cout<<"Введите m:\n> ", 
        std::cin>>m;
    std::cout<<"Введите n:\n> ", 
        std::cin>>n;
    mas = new int[n + m];
 
    for(i = 0; i < m + n; ++i)
        mas[i] = rand()%10;
 
    std::cout<<"Массив:\n";
    for(i = 0; i < m + n; ++i)
        std::cout<<mas[i]<<' ';
    
    int buf;//вот здесь начинается суть задания
    for(i = 0; i < m; ++i)
    {
        buf = mas[0];
        for(j = 0; j < m + n - 1; ++j)
            mas[j] = mas[j + 1];
        mas[m + n - 1] = buf;
    }//здесь заканчивается
    std::cout<<"Результат:\n";
    for(i = 0; i < m + n; ++i)
        std::cout<<mas[i]<<' ';
 
    fflush(stdin);
    std::cin.get();
    return EXIT_SUCCESS;
}
1
axel_
6 / 6 / 1
Регистрация: 06.02.2010
Сообщений: 14
06.02.2010, 13:17 3
Вот один из способов, но количество действий в нём m*n, а не m+n.
Пусть есть такой массив: ABCDabcdefg, соответственно m = 4, n = 7.
Для решения задачи нужно, чтобы блок abcdefg сместился влево, а блок ABCD - вправо, и результат должен быть abcdefgABCD (если я правильно понял задачу).
Все элементы блока abcdefg можно "протащить" влево, последовательно меняя местами с предыдущим элементом. Таких перестановок для каждого элемента из abcdefg понадобиться столько, сколько элементов в блоке ABCD (т.е. m перестановок). Порядок действий будет таков:

ABCDabcdefg // исходный массив, далее a меняется местами с D (делается swap)
ABCaDbcdefg // a сметился влево на одну позицию, далее a меняется местами с С (делается swap)
ABaCDbcdefg // ...
AaBCDbcdefg // ...
aABCDbcdefg // итак, за 4 перестановки (размер ABCD) элемент а сметился в самое начало, а блок
// ABCD полностью сметился вправо на одну позицию (порядок элементов сохранён)
// далее смещаем элемент b
aABCbDcdefg
aABbCDcdefg
aAbBCDcdefg
abABCDcdefg // блок ABCD сместился ещё на одну позицию, далее всё то же самое для с
. . . . . . . . .
abcdefgABCD // за m*n перестановок достигнут желаемый результат

Добавлено через 6 минут
Во, пока я писал, уже готовое решение дали. Но это тоже не m+n операций.
1
M128K145
Эксперт JavaЭксперт С++
8327 / 3548 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
06.02.2010, 13:18 4
Хм.. мой код можно немного оптимизировать, заменив строки 21-28 на такие
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int buf;
if(m < n)
    for(i = 0; i < m; ++i)
    {
        buf = mas[0];
        for(j = 0; j < m + n - 1; ++j)
            mas[j] = mas[j + 1];
        mas[m + n - 1] = buf;
    }
else
    for(i = 0; i < n; ++i)
    {
        buf = mas[m + n - 1];
        for(j = m + n - 1; j > 0; --j)
            mas[j] = mas[j - 1];
        mas[0] = buf;
    }
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2010, 13:18

Поиск отрезков
Прошу помочь потому-что я себе уже весь мозг вынес)) Задача номер K в...

Пересечение отрезков.
Решал задачу на acmp про пересечение отрезков, завалился на 20 тесте. Долго...

Длина отрезков
Составить программу для определения, который из двух отрезков на плоскости...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru