Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2018, 11:52   #1
ershowwk
 
Регистрация: 21.02.2015
Сообщений: 4
Восклицание Задача на поиск по двумерному массиву + последовательности

Решал задачи
1) Дан массив двумерный n*m. Все строки имеют возрастающую последовательность. Существует как минимум одно число А, которое есть в каждой строке. Его вывести надо.

Решил следующим образом
Код:
int main()
{
	int n, m;
	cin >> n >> m;

	int **a = new int*[n]; 
	for (int count = 0; count < n; count++)
		a[count] = new int[m];

	int counter = 1, memory = 0;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)	cin >> a[i][j];

	for (int j = 0; j < m; j++)
	{
		for (int i = 1; i < n; i++)
		{
			int l = 0;
			int r = m - 1;
			int mid = 0;
			while (l < r)
			{	mid = (l + r) / 2;
				if (a[i][mid] == a[0][j])
				{
					l = r = mid;
					memory = a[0][j];
				}
				else if (a[i][mid] < a[0][j]) l = mid + 1;
				
				else r = mid;
			}
			if (a[i][r] == a[0][j])	counter++;
			else i = n;
		}
		if (counter == n)
		{
			memory = a[0][j];
			j = m;
		}
	}
	cout << memory << endl;
}
сложность C*n*m*log(m) (C - const)
как сделать бы количество сравнений < C*m*n? Если просто брать элемент первой строки и по первым элементам первой строки сравнивать, брать второй и сравнивать с каждым вторым, это будет <Cmn?

И вторая проблема.
Нужно вывести в задаче для данных натуральных n,k (n>=k) все возрастающие элементы из k элементов в лексикографическом порядке.
Решил следующим образом.
Код:
int main()
{
	int n, k;
	cin >> n >> k;
	int *a = new int[k];
	for (int i = 0; i < k; i++) a[i] = i+1;
	bool b = true;
	while (b) {

		for (int i = 0; i < k; i++) cout << a[i] << ' ';
		cout << endl;
		int j = k - 1;
		while ((a[j] > (n - k + j)) && b)
			if (j < 0) b = false;
			else j--;
		if (j < 0) b = false;
		else {
			a[j]++;
			for (int i = j + 1; i < k; i++) a[i] =a[i-1]+1;
		}
	}

}
нашел в инете формулу, типа что увеличивать a[j] можно если a[j]=<n-k+j. Но не принимают у меня эту формулу. Говорят неверная. Решал строками - нельзя.

Строками, библиотеками и прочим пользоваться запрещено. Все ручками и в числах.
Буду рад любой идее.
ershowwk вне форума Ответить с цитированием
Старый 21.10.2018, 12:00   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
Все строки имеют возрастающую последовательность.
Цитата:
Строками, библиотеками и прочим пользоваться запрещено.
Это как? Сварить суп, водой и кастрюлей пользоваться запрещено ?
digitalis вне форума Ответить с цитированием
Старый 21.10.2018, 12:11   #3
ershowwk
 
Регистрация: 21.02.2015
Сообщений: 4
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Это как? Сварить суп, водой и кастрюлей пользоваться запрещено ?
ну да, препод говорит прогайте без всяких доп функций, руками.
ershowwk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не управляемое движение по двумерному массиву Kognor Паскаль, Turbo Pascal, PascalABC.NET 6 13.12.2015 10:38
Вопрос по двумерному массиву EdvardAvd Помощь студентам 16 26.11.2013 17:24
как пройти по двумерному массиву realgleb Общие вопросы C/C++ 9 10.05.2012 21:36
процедура к двумерному массиву Alenaa Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2011 19:34
Поиск числа по двумерному массиву. Ibanez Wizard Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 31.03.2011 13:52