Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Задача седловые элементы матрицы

#cpp #алгоритм


Условие задачи:


  Дана матрица aij размером n × m, состоящая из целых чисел. Требуется
  определить количество седловых элементов матрицы. Элемент матрицы
  aij называется седловым, если он является наименьшим в i-й строке и
  наибольшим в j-м столбце. Иными словами, элемент матрицы является
  седловым, если все элементы в соответствующей строке не меньше его, и
  при этом все элементы в соответствующем столбце не больше его


Моя ошибка заключается в превышении максимального времени работы (ограничение задачи
2 секунды)

вот само решение на C++

int main()
{
    int n=0, m=0;
    cin >> n >> m;
    vector> v(n, vector (m)); //Матрица NxM
    vector  s(n);
    for(int i=0; i> v[i][j];
            if(j==0||v[i][j] v[i][j]) break;//проверяем действительно ли он в
столбце максимальный
                    else if(z==(n-1)) sed++; 
                }
        }
    }
    cout << sed;
    return 0;
}

    


Ответы

Ответ 1



Проще поступить так: Вычислить массив Col[i] индексов (столбцов) наименьшего элемента в i-й строке. Вычислить массив Str[j] индексов (строк) наибольшего элемента в j-м столбце. В цикле по i проверять условие Str[Col[i]] == i.

Ответ 2



Вариант решения с учетом возможных повторений минимумов и максимумов. Не претендует на идеальный, памяти многовато ест. скорее всего можно оптимизировать. Временная сложность O(MxN), Использование дополнительной памяти O(MxN) Код на C#, но кроме двумерных массивов в данном фрагменте все идентично C++, адаптация не должна стать проблемой. int m;//Количество столбцов int n;//Количество строк //читаем M и N int[,] source = new int[m, n];//исходная матрица int[,] finder = new int[m, n];//матрица поиска //заполняем исходную матрицу любым способом //заполняем матрицу поиска нулями for (int j = 0; j < n; j++){ //ищем минимум в строке int minInd = 0; for (int i = 1; i < m; i++) if (source[minInd,j]>source[i,j]) minInd = i; //Отмечаем на матрице поиска все минимумы прибавляя 1 for (int i = 0; i < m; i++) if (source[minInd, j] == source[i, j]) finder[i, j]++; } //Повторяем все то же для максимумов столбцов for (int i = 0; i < m; i++){ int maxInd = 0; for (int j = 1; j < n; j++) if (source[i, maxInd] < source[i, j]) maxInd = j; for (int j = 0; j < n; j++) if (source[i, maxInd] == source[i, j]) finder[i, j]++; } int result = 0; for (int j = 0; j < n; j++) for (int i = 1; i < m; i++) if (finder[i, j] == 2)//если минимум строки и максимум столбца result++; //совпали, ячейка матрицы поиска будет равна 2 //из result забираем количество найденных седловых элементов

Комментариев нет:

Отправить комментарий