IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Дверь и шкаф, "Горе от ума"(С)
сообщение
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Вопрос: возможно ли пронести шкаф a*b*c через дверь p*q?
Мое решение:
write ( min(a,min(b,c)) < min(p,q))  and  (a+b+c-min(a,min(b,c))-max(a,max(b,c)) < max(p,q) );

Можно как-то оптимизировать? Учитывая, что паскаль я вижу впервые, и что я функции, по идее, знать не должен программа растягивается до некультурной длины.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


маленький упс.. там же можно еще и в плоскостях шкаф передвигать наверное..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Для протаскивания шкафа нужно, чтобы 2 из 3х его параметров удовлетворяли двери. Можно упорядочить стороны по возрастанию и взять первые 2 числа, а потом их уже сравнивать с дверью.. Правда, широкий низкий шкаф, который просто так по ширине не проходит, можно пронести, немного повернув его)


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Готово. Чуть позже постараюсь выложить объяснения.
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,p,q:real;
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.Text);
c:=strtofloat(edit3.Text);
if a<b then
begin
p:=a;
if c<b then q:=c
else q:=b;
end
else
begin
p:=b;
if c<a then q:=c
else q:=a;
end;
if p>q then begin a:=p; b:=q; end
else begin a:=q; b:=p; end;

p:=strtofloat(edit4.Text);
q:=strtofloat(edit5.Text);
if p>q then begin c:=p; p:=q; q:=c; end;

if a>q then
if p>= sqrt(a*a+b*b)*sin(arctan(2*a*b/(a*a-b*b))+arctan(sqrt(a*a+b*b-q*q)/q)) then
button1.Caption:='Can'
else button1.Caption:='Can''t'
else
if (b<=p) then button1.Caption:='Can'
else button1.Caption:='Can''t';
end;


Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Ребят, раздел - Алгоритмы! Программа - не есть алгоритм, она есть его реализация. Если вы кладете тут программу, то только как демонстрацию ранее приведенного алгоритма!

Даю возможность исправить ошибку задним числом.. ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> sqrt(a*a+b*b)*sin(arctan(2*a*b/(a*a-b*b))+arctan(sqrt(a*a+b*b-q*q)/q))

То есть ты решил учесть поворот?
Мне кажется, тут какая-то лажа.
Потому что второе слагаемое arctan(sqrt(...)) имеет не ту размерность.
Кстати, sin(arctan(x)) = x/sqrt(sqr(x)+1), причём корень тут берётся.
т.е. можно выражение очень упростить.
Первое слагаемое (sqrt(a*a+b*b)*sin(arctan(2*a*b/(a*a-b*b))) сожмётся до 2ab/sqrt(aa+bb)


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


TarasBer, там же, как ты сам и говорил, сумма арктангенсов. а еще играться с триногометрией.. я думаю там не проще будет.
Lapp, как мне сегодня рассказывали, программа - один из вариантов представления алгоритма. smile.gif
Я бы с удовольствием выложил алгоритм, но его надо сначало красиво переписать))) Сделаю чуть позже.

TarasBer, проверяй, пожалуйста. Вроде все чики пики. Я вчера ночером по миллиметрам линейкой считал: Прикрепленный файл  ____________.rar ( 176.59 килобайт ) Кол-во скачиваний: 411


Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


А, второй арктангенс под синусом. Понял.
Тогда так
sin(x+y)=sinxcosy+sinycosx=
(2abq+(a2-b2)sqrt(a2+b2-q2))/(a2+b2)sqrt(a2+b2)
После умножения на sqrt(a2+b2) из знаменателя исчезает корень:

if p*(a*a+b*b)>= 2*a*b*q+(a*a+b*b)*sqrt(a*a+b*b-q*q) then...

Кстати, в таком виде формула уже не вылетает при a=b.
Но симметрии всё равно пока нет. Надо дальше думать.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


После симметризации условие принимает вид такой:
(p2+q2)*(a2+b2)-4pqab>=
(a2+b2)*(a2+b2)-4abab.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


      alpha := arctan(sqrt(a*a+b*b-q*q)/q);
if a=b then beta := pi/2
else beta := arctan(2*a*b/(a*a-b*b));
d := sqrt(a*a+b*b);
h := d*sin(alpha+beta);
if (alpha+beta<pi/2)and(p >= h) then

Добавил такие ограничения, вроде уже при всех входных данных должно работать. С первого раза как-то забыл проверить..
TarasBer, можешь подробнее расписать, не могу уловить ход размышлений smile.gif
Lapp, вот только добрался, и написал "алгоритм" smile.gifПрикрепленное изображение

Сообщение отредактировано: sheka -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Вот никак не могу понять, откуда из вот этого
Цитата
p*(a*a+b*b)>= 2*a*b*q+(a*a+b*b)*sqrt(a*a+b*b-q*q)
берется вот это:
Цитата
После симметризации условие принимает вид такой:
(p2+q2)*(a2+b2)-4pqab>=
(a2+b2)*(a2+b2)-4abab.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Переносим 2*a*b*q налево, возводим в квадрат.
Потом, после приведения подобных, делим обе части на (a*a+b*b).

Добавлено через 2 мин.
Только не из p*(a*a+b*b)>= 2*a*b*q+(a*a+b*b)*sqrt(a*a+b*b-q*q)
а из p*(a*a+b*b)>= 2*a*b*q+(a*a-b*b)*sqrt(a*a+b*b-q*q)


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


TarasBer, что это за умное слово "симметризация" ? Нигде не могу его найти smile.gif
Интересует потому, что вроде в таком виде оно действительно симметрично, но правая часть будет ведь проще без ее, симметризации.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Нет такого термина, это я для наглядности сказал.
Да, правая часть может быть записана как sqr(a2-b2), но в таком виде неравенство выглядит интереснее.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 31.10.2020 15:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name