Консультация № 143647
11.09.2008, 15:24
0.00 руб.
0 4 2
Уважаемые специалисты!
Прошу вас помогите мне в следующей проблеме(как решить эту задачу?)
Дан массив размера N. Определить количество его промежутков монотонности (то есть участков, на которых его элементы возрастают или убывают).
Заранее спасибо!

Обсуждение

Неизвестный
12.09.2008, 07:00
общий
это ответ
Здравствуйте, Минин Руслан Васильевич!
Для этого определим вспомогательный массив, который будет отражать отношение между соседними элементами ('0' - элементы равны, '-' - правый элемент меньше левого, '+' - правый элемент больше левого). Затем в этом массиве посчитаем кол-во изменений знаков на '+' и '-'. Это и будет искомое значение. Подробнее смотрите в коде:
Код:
 #include <time.h>
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {

const int n = 10;

int arr[n];

srand((unsigned) time(NULL));
const int random_limit = 100;

cout << "Initial array" << endl;

for(int i=0; i<n; i++)
arr[i] = rand()%random_limit;

char signs[n];
signs[0] = '0';

for(int i=1; i<n; i++) {

if(arr[i] > arr[i-1])
signs[i] = '+';
else if(arr[i] < arr[i-1])
signs[i] = '-';
else
signs[i] = '0';
}

for(int i=0; i<n; i++)
cout << arr[i] << "\t" << signs[i] << endl;

int interval_count = 0;
for(int i=1; i<n; i++)
if(signs[i] != signs[i-1] && signs[i] != 0)
interval_count++;

cout << endl << "Count of intervals of monotonicty: " << interval_count << endl;

return 0;
}
Неизвестный
12.09.2008, 07:01
общий
Конечно можно было сделать компактнее, но так более наглядно...
Неизвестный
12.09.2008, 12:23
общий
это ответ
Здравствуйте, Минин Руслан Васильевич!
Я слегка изменил код от Терскова Сергея. Теперь считается не количество изменений знаков, а число промежутков где один и тот-же знак повторяется не менее чем установленное число раз.

Приложение:
#include <time.h>
#include <cstdlib>
#include <iostream>
//---------------------------------------------------------------------------

#pragma argsused

using namespace std;

int main(int argc, char* argv[]) {

const int n = 100;
const int MinRepeat=3;

int arr[n];

srand((unsigned) time(NULL));
const int random_limit = 100;

cout << "Initial array" << endl;

for(int i=0; i<n; i++)
arr[i] = rand()%random_limit;
/*
arr[0]=1;
arr[1]=2;
arr[2]=3;
arr[3]=4;
arr[4]=5;
arr[5]=3;
arr[6]=1;
arr[7]=0;
arr[8]=1;
arr[9]=2;
*/
char signs[n];
signs[0] = '0';

for(int i=1; i<n; i++) {

if(arr[i] > arr[i-1])
signs[i] = '+';
else if(arr[i] < arr[i-1])
signs[i] = '-';
else
signs[i] = '0';
}

for(int i=0; i<n; i++)
cout << arr[i] << "\t" << signs[i] << endl;

int interval_count = 0;
int RepeatCount;
bool isCalculate=false;
for(int i=1; i<n; i++)
{

if(signs[i] != signs[i-1] && signs[i] != 0)
{
RepeatCount=0;
isCalculate=false;
}
RepeatCount++;
if(RepeatCount>=MinRepeat&&(!isCalculate))
{
interval_count++;
isCalculate=true;
}
}
cout << endl << "Count of intervals of monotonicty: " << interval_count << endl;
int i;
cin>>i;

return 0;
}
Неизвестный
12.09.2008, 16:13
общий
Спасибо вам и за это!
Форма ответа