Пользователь вводит число сторон. Надо построить многоугольник с длинами сторон, которые тоже вводит пользователь. Задача не олимпиадная, но интересная.
Может, что-то связанное с пропорциональным делением суммы углов.Не знаю.
Ну, во-первых, надо, чтобы самая длинная сторона A была меньше суммы остальных.
Остальные стороны разбей на 2 набора B и C так, чтобы разность их длины была меньше, чем длина наибольшей стороны (ну типа просто сначала в один набор засунь всё, потом в другой переноси по одному элементу, пока разница не станет меньше длины наибольшей стороны).
А теперь строй треугольник со сторонами длиной A, B и C.
Дык а это и есть эн сторон. Просто некоторые из них продолжают друг друга.
Ладно, скажу так: ни одна сторона не должна продолжать другую.
Я не просто так сказал в начале, задача действительно интересная. Жаль только руки все не доходили до нее..
Интересная она как раз своей неоднозначностью. Если в задаче один ответ - обычно, проблем нет )). Я имею в виду проблемы выбора . А тут, вроде, сразу понятно, что ответов бесконечное количество (причем, мощности континуума, да еще и многомерного)). Но начинаешь решать - упираешься в какие-то странные трудности - какую именно форму выбрать и почему? И надо сказать, что вот это:
uses Graph;
const
m= 100;
var
l: array [1..m] of double;
i,n,gd,gm: integer;
r,r1,r2,a,d,cx,cy: double;
begin
Randomize;
gd:=0;
InitGraph(gd,gm,'');
cx:= GetMaxX/2;
cy:= GetMaxY/2;
n:=10;
for i:=1 to n do l[i]:= Random*cy/2;
for i:=1 to n do Write(l[i]:6:2);
WriteLn;
r1:=0;
r2:=0;
for i:=1 to n do begin
r2:= r2+l[i];
if l[i]>r1 then r1:=l[i]
end;
r2:=r2/4; // оценка радиуса сверху
r1:=r1/2; // оценка радиуса снизу
repeat
r:= (r1+r2)/2;
a:=0;
for i:=1 to n do a:= a+ArcTan(l[i]/2/Sqrt(Sqr(r )-Sqr(l[i]/2)));
if a>Pi then r1:=r else r2:=r
until Abs(r2-r1)<1e-12;
WriteLn('r = ',r:6:2);
MoveTo(Round(cx+r),Round(cy));
for i:=1 to n do begin
a:= a+ArcTan(l[i]/2/Sqrt(Sqr(r )-Sqr(l[i]/2)));
LineTo(Round(cx+r*Cos(2*a)),Round(cy+r*Sin(2*a)));
end;
ReadLn;
CloseGraph
end.
Спасибо.