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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 16:08   #1
MAKEDON
The First Person!
Форумчанин
 
Аватар для MAKEDON
 
Регистрация: 07.08.2007
Сообщений: 228
По умолчанию Принцип решения.

У меня тут возник вопрос по поводу одной задачи. Ее нужно решать с помощью математических расчетов? Или моделировать ситуацию и смотреть результат? Но, тут проблема с размером массива.

Вот, собственно, задача:
Вложения
Тип файла: doc Газон.doc (88.5 Кб, 24 просмотров)
Программа обычно делает то что вы ей сказали сделать, а не то что бы вы хотели, чтобы она сделала.
MAKEDON вне форума Ответить с цитированием
Старый 15.01.2010, 16:57   #2
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Можно решать математически, но это довольно геморный способ (имею ввиду решение, у которого сложность даже ниже, чем log(n), близко к О(1)), а сдесь прокатит и обычное моделирование в одном измерении (считать за О(1) целую линию в вертикальном или горизонтальном направлении), тогда получим О(N) относительно ширины области покрытия.

Последний раз редактировалось LeBron; 15.01.2010 в 22:07.
LeBron вне форума Ответить с цитированием
Старый 15.01.2010, 21:25   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ради интереса решил. У меня получилась логарифмическая сложность.
ЗЫ Никакого массива не использовал.

Последний раз редактировалось Carbon; 15.01.2010 в 21:30.
Carbon вне форума Ответить с цитированием
Старый 16.01.2010, 14:25   #4
MAKEDON
The First Person!
Форумчанин
 
Аватар для MAKEDON
 
Регистрация: 07.08.2007
Сообщений: 228
По умолчанию

Чтобы решать в общем виде массивом нужно создать массив a[200000][200000]. Но это слишком большой, как быть?
Программа обычно делает то что вы ей сказали сделать, а не то что бы вы хотели, чтобы она сделала.
MAKEDON вне форума Ответить с цитированием
Старый 16.01.2010, 15:12   #5
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Кинуть своё решение?
Carbon вне форума Ответить с цитированием
Старый 16.01.2010, 16:56   #6
LeBron
Форумчанин
 
Регистрация: 10.10.2009
Сообщений: 680
По умолчанию

Если надо за линейное время (не самый оптимальный, но, как мне показалось, самый простой способ решения) - тогда линейный массив.
Если чуть пошевелить мозгами, то в таком случае можно и вообще без массива, ведь мы будем на ходу суммировать результаты с текущим ответом.
LeBron вне форума Ответить с цитированием
Старый 16.01.2010, 17:57   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Ладно. Мой вариант:
Код:
#include <stdio.h>


inline bool in_round( int x, int y, int x3, int y3, int r )
{
	return ( x - x3 )*( x - x3 ) + ( y - y3 )*( y - y3 ) <= r*r;
}


long long count( int xs, int ys, int xf, int yf, int x3, int y3, int r )
{
	bool ss = in_round( xs, ys, x3, y3, r );
	bool sf = in_round( xs, yf, x3, y3, r );
	bool fs = in_round( xf, ys, x3, y3, r );
	bool ff = in_round( xf, yf, x3, y3, r );

	if ( ss && sf && fs && ff ) return ( long long )( xf - xs + 1 )*( long long )( yf - ys + 1 );
	if ( !ss && !sf && !fs && !ff ) return 0;
	
	if ( xs < xf && ys == yf )
	{
		int xm = ( xs + xf )/2;
		return count( xs, ys, xm, yf, x3, y3, r ) + count( xm + 1, ys, xf, yf, x3, y3, r );
	}

	if ( xs == xf && ys < yf )
	{
		int ym = ( ys + yf )/2;
		return count( xs, ys, xf, ym, x3, y3, r ) + count( xs, ym + 1, xf, yf, x3, y3, r );
	}

	if ( xs < xf && ys < yf )
	{
		int xm = ( xs + xf )/2;
		int ym = ( ys + yf )/2;

		return count( xs, ys, xm, ym, x3, y3, r ) + count( xm + 1, ys, xf, ym, x3, y3, r ) +
			count( xs, ym + 1, xm, yf, x3, y3, r ) + count( xm + 1, ym + 1, xf, yf, x3, y3, r );
	}

	return 0;
}


int main( int, char ** )
{

	int x1, y1;
	int x2, y2;
	int x3, y3;
	int r;

	scanf( "%d%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3, &r );

#define min( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
#define max( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )

	int xs = max( x1, x3 - r ), ys = max( y1, y3 - r );
	int xf = min( x2, x3 + r ), yf = min( y2, y3 + r );
	int x = min( xs, x3 );
	int y = min( ys, y3 );

	printf( "count = %I64u", count( xs - x, ys - y, xf - x, yf - y, x3 - x, y3 - y, r ) );

	getchar();
	getchar();

	return 0;
}

Последний раз редактировалось Carbon; 16.01.2010 в 18:05.
Carbon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принцип действия увеличения репутации Neeter О форуме и сайтах клуба 3 14.05.2009 08:08
Принцип поисковых систем Romanbl4 Свободное общение 7 23.08.2007 18:31
принцип PHP ErWe PHP 3 11.05.2007 20:06