Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Bleize
0 / 0 / 0
Регистрация: 17.10.2010
Сообщений: 26
#1

Массивы(статические) - C++

26.11.2010, 21:59. Просмотров 986. Ответов 1
Метки нет (Все метки)

Найти максимальную по длине монотонную (т. е. либо неубывающую, либо невозрастающую) подпоследовательность заданного массива целых чисел
P.S. При выполнении работы используются статические массивы. Для организации статических массивов с псевдопеременными границами необходимо объявить массив достаточно большой длины N. Затем пользователь вводит реальную длину массива (не больше N) и работает с массивом той длины, которую он сам указал. Остальные элементы (хотя память под них и будет выделена) не рассматриваются. При уменьшении или увеличении длины массива необходимо изменять его реальную длину.

Добавлено через 4 минуты
[20:56:57]
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
 #include <iostream>
using namespace std;
 
void main()
{
 const int N = 1000;
 int a[N], size, i, k1, k2, k3, n, k;
 cout<<"Enter the size of the array: "; cin>>size;
 for(i=0;i<size;i++){cout<<"the "<<i+1<<"th element: ";cin>>a[i];}
 cout<<endl<<"Array: ";
 for(i=0;i<size;i++)cout<<a[i]<<" ";
 cout<<endl;
 for(i=0,k1=0,k2=1,n=0;i<size-1;i++)
 {if(a[i+1]<a[i])k1++; else{if(k1>=k2)k2=k1; k1=0;} if(k2<=k1)n=i+1;} 
 if(k2<k1) k2=k1;
 for(i=0,k1=0,k3=1,k=0;i<size-1;i++)
 {if(a[i+1]>a[i])k1++; else{if(k1>=k3)k3=k1; k1=0;} if(k3<=k1)k=i+1;}
 if(k3<k1) k3=k1;
 if(n==size-2) if(a[size-1]<a[n]) {n=size-1; k2++;}
 if(k==size-2) if(a[size-1]>a[k]) {k=size-1; k3++;}
 if(k3>k2){n=k; k2=k3;} else if(k3=k2) if(k>n){n=k; k2=k3;}
 cout<<"Maximum long period - "<<k2+1<<" element(s): ";
 for(i=n-k2;i<=n;i++) cout<<a[i]<<" "; 
 cout<<endl; 
}
или помогите исправить ошибку:
размер 10
10 9 8 7 6 7 6 5 10 20(р-тат неверен)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2010, 21:59     Массивы(статические)
Посмотрите здесь:

Одномерные статические массивы C++
двумерные статические массивы C++
Одномерные статические массивы C++
C++ Статические массивы
Статические массивы, члены класса C++
статические массивы C++
статические массивы C++
C++ Статические массивы
C++ Массивы. Статические и динамические
Взять статические строки заменить на динамические массивы и распечатать C++
C++ Динамические и статические массивы
C++ Статические массивы(был бы очень признателен)!

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ne6u4u
12 / 12 / 0
Регистрация: 14.11.2010
Сообщений: 29
27.11.2010, 15:40     Массивы(статические) #2
простестил тока на твоем примере, так что 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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int N;
    const int MAX = 1000;
    int arr[MAX], temp_arr[MAX];
    
    //Ввод массива
    cout << "Введите размерность массива: ";
    cin >> N;
    cout << "Заполните массив:\n";
    for (int i=0; i<N; i++)
    {
        cout << i+1 << " элемент: ";
        cin >> arr[i];
    }
 
    //создаю массив для отслеживания последовательносетей
    for (int i=0; i<N-1; i++)
    {
        if ((arr[i] - arr[i+1]) == 1)
            temp_arr[i] = -1;
        else if ((arr[i] - arr[i+1]) == -1)
            temp_arr[i] = 1;
        else
            temp_arr[i] = 0;
    }
 
 
    //вычисление наибольшей последовательности
    int index=0, delta=0, temp_ind=0, temp_del=0;
    if (temp_arr[0]==1 || temp_arr[0]==-1)
    {
        temp_ind = 0; temp_del = 1;
    }
    for (int i=1; i<N; i++)
    {
        if((temp_arr[i]==1 && temp_arr[i-1]==1) || ((temp_arr[i]==-1 && temp_arr[i-1]==-1)))
        {
            temp_del++;
        }
        else if ((temp_arr[i]==1 && temp_arr[i-1]==-1) || ((temp_arr[i]==-1 && temp_arr[i-1]==1)))
        {
            if (temp_del > delta)
            {
                index = temp_ind;
                delta = temp_del;
            }
            temp_del = 1;
            temp_ind = i+1;
        }
        else
        {
            if (temp_del > delta)
            {
                index = temp_ind;
                delta = temp_del;
            }
            temp_del = 1;
            temp_ind = i;
        }
    }
    cout << endl;
 
    // Вывод введенного массива
    for (int i=0; i<N; i++)
        cout << arr[i] << " ";
    cout << endl;
    if(temp_arr[index] == 1)
        cout << "Наибольшая по длине последовательность монотонно возрастающая" << endl;
    if(temp_arr[index] == -1)
        cout << "Наибольшая по длине последовательность монотонно убывающая" << endl;
    cout << "Номер элемента с которого начинается данная последовательность - " << index+1 << endl;
    cout << "Последовательность состоит из " << delta+1 << " значений." << endl;
    cout << "Последовательность: ";
    for (int i=0; i<delta+1; i++)
    {
        cout << arr[index+i] << " ";
    }
    cout << endl;
    return 0;
}
Добавлено через 13 часов 19 минут
Не у меня с математикой плохо ночью) 1 3 5 тоже монотонная последовательность, тогда, наверно, так
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
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    int N;
    const int MAX = 1000;
    int arr[MAX], temp_arr[MAX];
    
    //Ввод массива
    cout << "Введите размерность массива: ";
    cin >> N;
    cout << "Заполните массив:\n";
    for (int i=0; i<N; i++)
    {
        cout << i+1 << " элемент: ";
        cin >> arr[i];
    }
 
    //создаю массив для отслеживания последовательносетей
    for (int i=0; i<N-1; i++)
    {
        temp_arr[i] = arr[i] - arr[i+1];
    }
 
 
    //вычисление наибольшей последовательности
    int index=0, delta=0, temp_ind=0, temp_del=0;
    temp_ind = 0;
    temp_del = 1;
 
    for (int i=0; i<N; i++)
    {
        if (temp_arr[i] == temp_arr[i+1])
        {
            temp_del++;
        }
        else
        {
            if(temp_del > delta)
            {
                index = temp_ind;
                delta = temp_del;
            }
            temp_del = 1;
            temp_ind = i+1;
        }
    }
    cout << endl;
 
    // Вывод введенного массива
    for (int i=0; i<N; i++)
        cout << arr[i] << " ";
    cout << endl;
    if(temp_arr[index] < 0)
        cout << "Наибольшая по длине последовательность монотонно возрастающая" << endl;
    if(temp_arr[index] > 0)
        cout << "Наибольшая по длине последовательность монотонно убывающая" << endl;
    cout << "Номер элемента с которого начинается данная последовательность - " << index+1 << endl;
    cout << "Последовательность состоит из " << delta+1 << " значений." << endl;
    cout << "Последовательность: ";
    for (int i=0; i<delta+1; i++)
    {
        cout << arr[index+i] << " ";
    }
    cout << endl;
    return 0;
}
Yandex
Объявления
27.11.2010, 15:40     Массивы(статические)
Ответ Создать тему
Опции темы

Текущее время: 12:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru