题目描述
农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。
输入输出格式
输入格式:输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目。接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000)。数字用小数表示。
输出格式:输出必须包括一个实数,表示必须的围栏的长度。答案保留两位小数。
输入输出样例
输入样例#1:
复制
4 4 8 4 12 5 9.3 7 8
var x,y:array[-1..100001]of real; i,j,n,s,t,l:longint; ans:real; function count(x1,y2,x2,y1,x0,y0:real):real; begin exit((x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)); end; procedure main; var i,j,k:longint; ss,s:real; begin k:=0; x[k]:=maxlongint; y[k]:=x[k]; for i:=1 to n do if (x[i]<x[k])or(x[i]=x[k])and(y[i]<y[k]) then k:=i; l:=k; repeat i:=0; ss:=0; for j:=1 to n do if j<>k then begin if i<>0 then ss:=count(x[i],y[j],x[j],y[i],x[k],y[k]); if (ss<0)or(i=0) then begin s:=sqrt(sqr(x[k]-x[j])+sqr(y[k]-y[j])); i:=j; end; end; ans:=ans+s; k:=i; until l=k; end; begin //while true do // begin read(n); // if n=0 then break; for i:=1 to n do readln(x[i],y[i]); if n=1 then write('0.00') else begin ans:=0; main; write(ans:0:2); end; // end; end.