思想的話就不想寫了
有興趣的童鞋詳見《演算法藝術》以及以下的**:
下面給乙個帶註解的**:
program liukee;type lkj=record
x:double;
y:double;
end;
var a:array[1..10000] of lkj;
s:array[0..10000] of longint;
temp:lkj;
top,i,n:longint;
ans,r:double;
function dis(a,b:lkj):double;
begin
exit(sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));//這裡為了保證精度,必須這麼寫
end;
function calc(a,b,c:lkj):double;//計算向量的叉
var x1,y1,x2,y2:double;
begin
x1:=a.x-c.x;
x2:=b.x-c.x;
y1:=a.y-c.y;
y2:=b.y-c.y;
exit(x1*y2-x2*y1);
end;
procedure qsort(l,r:longint);//對點進行排序
var mid,temp:lkj;
i,j:longint;
begin
i:=l;
j:=r;
mid:=a[(l+r)>>1];//可以隨機化
repeat
while(calc(a[i],mid,a[1])>0)or((calc(a[i],mid,a[1])=0)and(dis(a[i],a[1])dis(mid,a[1])))do dec(j);
if i<=j then
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
inc(i);
dec(j);
end;
until i>j;
if l1)and(calc(a[i],a[s[top]],a[s[top-1]])>0)do//不用打等於0因為這種共線情況已在之前的排序中處理了
dec(top);
inc(top);
s[top]:=i;
end;
//計算結果
ans:=0;
ans:=ans+dis(a[s[top]],a[s[1]]);
for i:=1 to top-1 do
ans:=ans+dis(a[s[i]],a[s[i+1]]);
writeln(round(ans));
end.
BZOJ3348 Cows 凸包 凸包面積
題目鏈結 題意 求凸包,求面積,然後給面積除以50,向下取整。用的andrew演算法,即跑兩次,先求出下凸包,然後再求出上凸包。求面積時候應該用凸包陣列求,結果寫成了原來的點的陣列,調了20多分鐘。弱智 2 telekinetic forest guard include include inclu...
poj1113 求凸包 計算凸包周長
經典的求凸包題,模板題。要求用資源最少,那肯定這個多邊形是個凸多邊形,也就是凸包。所以先求出凸包,計算它的周長。還有就是這道題所說的,要離城牆l遠,其實就是在加上乙個圓的周長,圓的半徑就是l。都說到這了,這道題還差什麼?還差乙個經典的凸包模板!哈哈 如下 include include includ...
bzoj2829 信用卡凸包 凸包
26.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 1.5707963268 21.66 本樣例中的2張信用卡的輪廓在上圖中用實線標出,如果視1.5707963268為 pi 2 pi為圓周率 則其凸包的周長為16 4 sqrt 2 題解 把邊上的圓去掉然後求一遍凸包,最後再加上乙個圓...