#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 забираем количество найденных седловых элементов
Комментариев нет:
Отправить комментарий