Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/56: Рейтинг темы: голосов - 56, средняя оценка - 4.86
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
1

Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию

12.01.2013, 02:05. Показов 10538. Ответов 40
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию.
на языке С++, через цикл for, самым легким способом, я только начинаю учить язык
пожалуйста..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2013, 02:05
Ответы с готовыми решениями:

Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию
Объясните пожалуйста как можно подробнее,как работает эта программа?(желательно все циклы и строки)...

Дана последовательность чисел. Требуется вычеркнуть из нее минимальное количество чисел так, чтобы оставшиеся шли в порядке возрастания.
Даны N целых чисел X1, X2, ..., XN. Требуется вычеркнуть из них минимальное количество чисел так,...

Вычеркнуть минимальное количество чисел, чтобы оставшиеся шли в порядке возрастания (дин. программирование)
Написать программу, которая использует метод динамического программирования. Даны N целых чисел...

Удалить из массива минимальное количество элементов, чтобы массив стал упорядочен по возрастанию
Всем добрый день Задача Дан массив чисел, необходимо удалить из данного массива минимальное ...

40
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 03:15 21
Author24 — интернет-сервис помощи студентам
Пока выполняется mas[i]<mas[i+1] все нормально, как только перестает выполняться начинаем сравнивать последующие элементы с тем mas[i] до конца массива или до того момента пока снова не будет выполняться mas[i]<mas[i+n]
Оно?
0
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
12.01.2013, 03:34 22
0 1 2 3 8 2 3 4 5 9 10
выделит 0 1 2 3 8 и 2 3 4 5 9 10
Первый короче, удалит элементы 2 3 и 8 или 3 и 8 как условие поставить
Ответ будет: 0 1 2 3 4 5 9 10

Добавлено через 1 минуту
8 2 3 удалит... И что неправильно?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
12.01.2013, 03:36 23
Цитата Сообщение от contedevel Посмотреть сообщение
Можно, найти два рядом стоящих подмассива, в которых элементы возрастают, сравнить их размерности и обнулить в наименьшем все элементы, которые больше или меньше первого или последнего элемента наибольшего массива, зависит от позиции слева или справа наибольший. Нули игнорировать в подмассивах. Делать пока размерность подмассива не станет равна массиву, За цикл for забудь, это ужас просто будет...лучше while.
такая программа будет работать корректно, извини, но код довольно большой будет писать не буду, если нужно будет в личку напиши, завтра тогда напишу...
Цитата Сообщение от contedevel Посмотреть сообщение
И что неправильно?
в пердыдущем посте немного неудачный контрпример подобрал, который не опровергал твоё предложение... Вот этот лучше:

пример 3 6 7 9 4 8 11 12

твоя программа выделит 2 подмассива
3 6 7 9
4 8 11 12
Рассмотрит, из какого лучше удалить лишние элементы
если из первого, то результат 3 4 8 11 12
если из второго, то результат 3 6 7 9 12
и твоя программа выдаст тот, что длиннее(или любой, в случае, когда одинаковы) 3 4 8 11 12
верный же вариант 3 6 7 9 11 12


Так что, не всё так просто.
0
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
12.01.2013, 03:55 24
Здесь согласен, неверно)

Добавлено через 4 минуты
Ну, тогда, еще в условие выборку на границах массивов организовать, и затем уже выбрать наибольший вариант

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

Добавлено через 2 минуты
Это частный случай, он один, ну, возможно, еще сможет быть один-два, это нужно проверить точно, но так или иначе это будет уже на соседних границах массивов, и легко добавить в условие выборки

Добавлено через 4 минуты
Лучше нарисовать эти два массива в виде кривых и посмотреть все возможные варианты....так точно можно будет узнать, все ли случаи проходят проверку...
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.01.2013, 04:21 25
DONE!
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
int main() {
    int mas[11];
    int i,j;
 
 
    for (i = 0;i < 10;++i) {
        cin >> mas[i];
    }
 
    for (i = 0;i < 10;++i) {
        if (mas[i] >= mas[i+1]) {
            mas[i+1] = 0;
            for (j = i + 1;j < 10;++j) {
                if (mas[i] >= mas[j])
                    mas[j] = 0;
            }
 
        }
 
    }
 
    for (i = 0; i < 10;++i) {
        cout << mas[i];
    }
 
return 0;
}
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 04:34 26
in: 0 1 2 3 8 2 3 4 5 9 10
stdout:
0 1 2 3 8 0 0 0 0 9

Вывод: не работает

точнее не совсем корректно
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.01.2013, 04:38 27
Серьёзно ?
Миниатюры
Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию   Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию  
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 04:42 28
советую вам посмотреть тему с самого начала)

и ваш скрин совсем не нужен, тоже самое есть в моем сообщение, + как мне кажется в конце не хватает 10ки

---
10ка сути не меняет, работает не совсем так как надо
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.01.2013, 04:50 29
Пока можно сделать так
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
    int mas[11];
    int i,j;
 
 
    for (i = 0;i < 10;++i) {
        cin >> mas[i];
    }
 
    for (i = 0;i < 10;++i) {
        if (mas[i] >= mas[i+1]) {
            mas[i+1] = 0;
            for (j = i + 1;j < 10;++j) {
                if (mas[i] >= mas[j])
                    mas[j] = 0;
            }
 
        }
 
    }
    int mas_t[sizeof(mas) / sizeof(mas[0])];
    
 
    for (i = 0; i < 10;++i) {
        if (mas[i] != 0)
        {
            mas_t[i] = mas[i];
        cout << mas_t[i];
        }
    }
return 0;
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 05:03 30
Конечно без обид, но яйца в профиль
Цитата Сообщение от contedevel Посмотреть сообщение
0 1 2 3 8 2 3 4 5 9 10
выделит 0 1 2 3 8 и 2 3 4 5 9 10
Первый короче, удалит элементы 2 3 и 8 или 3 и 8 как условие поставить
Ответ будет: 0 1 2 3 4 5 9 10

in: 0 1 2 3 8 2 3 4 5 9 10
stdout: 1 2 3 8 9

Еще и 0 куда-то делся)
http://liveworkspace.org/code/2FNbzz$2

Но тут уж скорее дело в не точно поставленном условие. Автор и сам точно не знает, что ему нужно
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.01.2013, 05:06 31
Fareiro,

VlaDdislav
Допустим задан следующий массив
1 2 5 6 3 4 4 5 9
по условию задачи в массиве должно остаться
1 2 5 6 9

Добавлено через 44 секунды
удаленные заменить "0"
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 05:09 32
Допустим задан следующий массив
1 2 5 6 3 4 4 5 9
по условию задачи в массиве должно остаться
1 2 5 6 9
Но нельзя и исключать последовательность: 1 2 3 4 5 9
согласны?
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.01.2013, 05:12 33
Fareiro, Согласен,но в данном случаи,по заданию результат такой,каким он должен быть по заданию.
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 05:16 34
Нет, не верно. По заданию, нужно удалить минимальное число элементов...

В массиве 1 2 5 6 3 4 4 5 9
Есть 2 подмассива:
1 2 3 4 5 9
1 2 5 6 9
Для первого нужно удалить: 3 элемента
Для второго: 4
Следовательно первый вариант правильный, а ваш выдает второй, что уже не соответствует условию)

Я вас убедил?)
0
70 / 64 / 5
Регистрация: 09.06.2012
Сообщений: 291
12.01.2013, 05:36 35
Fareiro, Я уже писал,выполнил так как было написано в задание . Придет тс будим,уточнять.

Не по теме:

нужно удалить минимальное число элементов звучит как то,не корректно.



Добавлено через 11 минут
Всё у меня верно,если идёт 2 4 3 5 6, то верно будит 2 4 5 6,а не 2 3 4 5 6.Это не сортировка.
0
15 / 15 / 11
Регистрация: 06.12.2012
Сообщений: 131
12.01.2013, 05:44 36
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Fareiro, Я уже писал,выполнил так как было написано в задание . Придет тс будим,уточнять.

Не по теме:

нужно удалить минимальное число элементов звучит как то,не корректно.



Добавлено через 11 минут
Всё у меня верно,если идёт 2 4 3 5 6, то верно будит 2 4 5 6,а не 2 3 4 5 6.Это не сортировка.
А где вы увидели у меня сортировку? Или это вы так?))
0
9 / 9 / 1
Регистрация: 01.07.2012
Сообщений: 138
12.01.2013, 05:52 37
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Не по теме:
нужно удалить минимальное число элементов звучит как то,не корректно.
Считайте, что нужно найти максимальное (по числу элементов) упорядоченное подмножество данного массива с сохранением исходного порядка следования.
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.01.2013, 06:08 38
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
#include <iostream>
using namespace std;
int main()
{
      int a[100][2], max, i, j, N;
      cout<<"N= ";
      cin>>N;
      max=N-1;
      for(i=0; i<N; i++)
      {
          cout<<"["<<i+1<<"]= ";
          cin>>a[i][0];
          a[i][1]=0;
      }
      a[N-1][1]=1;
      for(i=N-2; i>=0; i--)
      {
          a[i][1]=1;
          for(j=i+1; j<N; j++)
              if(a[j][0]>a[i][0] && a[i][1]<a[j][1]+1)
                  a[i][1]=a[j][1]+1;
          if(a[max][1]<a[i][1])
              max=i;
      }
      while(a[max][1]>1)
      {
          cout<<a[max][0]<<" ";
          for(i=max+1; i<N; i++)
              if(a[max][0]<a[i][0] && a[max][1]==a[i][1]+1)
              {
                  max=i;
                  break;
              }
      }
      cout<<a[max][0]<<endl;
      return 0; 
}
0
73 / 73 / 13
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
12.01.2013, 08:25 39
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
#include <iostream>
 
using namespace std;
 
int main(void)
{
    const unsigned array_size = 10;
    unsigned MyArray[array_size];
    cout<<"Enter array...\n";
    for(unsigned i=0; i<array_size; i++){
        cout<<" value "<<i+1<<"/"<<array_size<<" : ";
        cin>>MyArray[i];
    };
 
    // посмотрим
    cout<<"\n Array before : ";
    for(unsigned i=0; i<array_size-1; i++) cout<<MyArray[i]<<", ";
    cout<<MyArray[array_size-1]<<".\n";
 
    int Badness, BadnessMax;
    int IndexOfBadElement = 0;  // будем считать, что первый элемент не подходит
 
    while(IndexOfBadElement >= 0){
 
        // вычислим "негодность" каждого элемента и индекс главного "негодяя"
        IndexOfBadElement = -1;
        BadnessMax = 0;
 
        // чем больше количество элементов до него, которые больше него и после него, которые меньше, тем хуже
        for(unsigned i=0; i<array_size; i++){
            Badness = 0;
            if(MyArray[i] != 0){
                for(unsigned i1=0; i1<array_size; i1++)
                    if(MyArray[i1] != 0 && ((i1 < i && MyArray[i1] > MyArray[i]) || (i1 > i && MyArray[i1] < MyArray[i])))
                        Badness++;
            }
            if(Badness > BadnessMax){
                BadnessMax = Badness;
                IndexOfBadElement = i;
            }
        }
 
        if(IndexOfBadElement >= 0){
            // обнуляем самый непотребный елемент
            MyArray[IndexOfBadElement] = 0;
        }
    }
 
    // посмотрим после обработки
    cout<<"\n Array after  : ";
    for(unsigned i=0; i<array_size-1; i++) cout<<MyArray[i]<<", ";
    cout<<MyArray[array_size-1]<<".\n";
 
    system("pause");
    return 0;
}
Добавлено через 58 секунд
вот, надеюсь прокомментировал понятно, вроде работает

Добавлено через 15 минут
вот то же самое, только размер массива можно любой задать и одинаковые элементы убираются
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
#include <iostream>
using namespace std;
int main(void)
{
    unsigned array_size;
    cout<<"Enter array size :";
    cin>>array_size;
    if(array_size <= 0) return 0;
 
    unsigned *MyArray = new unsigned int[array_size];
 
    cout<<"Enter array values...\n";
    for(unsigned i=0; i<array_size; i++){
        cout<<" value "<<i+1<<"/"<<array_size<<" : ";
        cin>>MyArray[i];
    };
 
    // посмотрим
    cout<<"\n Array before : ";
    for(unsigned i=0; i<array_size-1; i++) cout<<MyArray[i]<<", ";
    cout<<MyArray[array_size-1]<<".\n";
 
    int Badness, BadnessMax;
    int IndexOfBadElement = 0;  // будем считать, что первый элемент не подходит
 
    while(IndexOfBadElement >= 0){
 
        // вычислим "негодность" каждого элемента и индекс главного "негодяя"
        IndexOfBadElement = -1;
        BadnessMax = 0;
 
        // чем больше количество элементов до него, которые больше или равны него и после него, которые меньше или равны, тем хуже
        for(unsigned i=0; i<array_size; i++){
            Badness = 0;
            if(MyArray[i] != 0){
                for(unsigned i1=0; i1<array_size; i1++)
                    if(MyArray[i1] != 0 && ((i1 < i && MyArray[i1] >= MyArray[i]) || (i1 > i && MyArray[i1] <= MyArray[i])))
                        Badness++;
            }
            if(Badness > BadnessMax){
                BadnessMax = Badness;
                IndexOfBadElement = i;
            }
        }
 
        if(IndexOfBadElement >= 0){
            // обнуляем самый непотребный елемент
            MyArray[IndexOfBadElement] = 0;
        }
    }
 
    // посмотрим после обработки
    cout<<"\n Array after  : ";
    for(unsigned i=0; i<array_size-1; i++) cout<<MyArray[i]<<", ";
    cout<<MyArray[array_size-1]<<".\n";
 
    system("pause");
    delete[] MyArray;
    return 0;
}
0
1 / 1 / 1
Регистрация: 10.01.2013
Сообщений: 18
12.01.2013, 08:34 40
Цитата Сообщение от VlaDdislav Посмотреть сообщение
Допустим задан следующий массив
1 2 5 6 3 4 4 5 9
по условию задачи в массиве должно остаться
1 2 5 6 9

Добавлено через 44 секунды
удаленные заменить "0"

так ты удаляешь 4 числа, удалив 5 6 и 4 получишь: 1 2 3 4 5 9

Не по теме:

мимо проходил

0
12.01.2013, 08:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2013, 08:34
Помогаю со студенческими работами здесь

Вычеркнуть минимально возможное количество чисел так, чтобы оставшиеся шли в порядке возрастания
Дана последовательность из целых чисел, среди которых нет двух одинаковых. Требуется вычеркнуть...

Описать процедуру RemoveForInc(A, N), удаляющую из массива «лишние» элементы так, чтобы оставшиеся оказались упорядочены по возрастанию
Описать процедуру RemoveForInc(A, N), удаляющую из веществен- ного массива A размера N «лишние»...

Требуется вычеркнуть минимально возможное количество чисел так, чтобы оставшиеся числа шли в порядке возрастания
27. Дана последовательность из N целых чисел, среди которых нет двух одинаковых. Требуется...

удалить из числа 3 цифры так, чтобы оставшиеся цифры составили наименьшее число.
Наименьшее число Пусть задано некоторое натуральное число N. (число цифр в этом числе больше 3 и...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru