Вопрос: возможно ли пронести шкаф 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) );
маленький упс.. там же можно еще и в плоскостях шкаф передвигать наверное..
Для протаскивания шкафа нужно, чтобы 2 из 3х его параметров удовлетворяли двери. Можно упорядочить стороны по возрастанию и взять первые 2 числа, а потом их уже сравнивать с дверью.. Правда, широкий низкий шкаф, который просто так по ширине не проходит, можно пронести, немного повернув его)
Готово. Чуть позже постараюсь выложить объяснения.
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;
Ребят, раздел - Алгоритмы! Программа - не есть алгоритм, она есть его реализация. Если вы кладете тут программу, то только как демонстрацию ранее приведенного алгоритма!
Даю возможность исправить ошибку задним числом.. ))
> 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)
TarasBer, там же, как ты сам и говорил, сумма арктангенсов. а еще играться с триногометрией.. я думаю там не проще будет.
Lapp, как мне сегодня рассказывали, программа - один из вариантов представления алгоритма.
Я бы с удовольствием выложил алгоритм, но его надо сначало красиво переписать))) Сделаю чуть позже.
TarasBer, проверяй, пожалуйста. Вроде все чики пики. Я вчера ночером по миллиметрам линейкой считал:
____________.rar ( 176.59 килобайт )
Кол-во скачиваний: 664
А, второй арктангенс под синусом. Понял.
Тогда так
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.
Но симметрии всё равно пока нет. Надо дальше думать.
После симметризации условие принимает вид такой:
(p2+q2)*(a2+b2)-4pqab>=
(a2+b2)*(a2+b2)-4abab.
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
Вот никак не могу понять, откуда из вот этого
Переносим 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)
TarasBer, что это за умное слово "симметризация" ? Нигде не могу его найти
Интересует потому, что вроде в таком виде оно действительно симметрично, но правая часть будет ведь проще без ее, симметризации.
Нет такого термина, это я для наглядности сказал.
Да, правая часть может быть записана как sqr(a2-b2), но в таком виде неравенство выглядит интереснее.