日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

wall poj 1113

發(fā)布時(shí)間:2025/3/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wall poj 1113 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://poj.org/problem?id=1113

題意:一個(gè)國(guó)王要在自己的城堡周圍建一堵圍墻,要求圍墻距城堡最短距離為L(zhǎng)。問建這樣一堵圍墻的最短長(zhǎng)度是多少。

?

題解思路:顯然圍墻建的距城堡越近越好,這樣對(duì)于城堡的邊我們沿著城堡距離L的地方建就可以了,對(duì)于城堡的頂點(diǎn),我們以頂點(diǎn)為圓心,以L為半徑畫一段圓弧。易之圍墻的周長(zhǎng)即為圓弧和+沿城堡建的圍墻的和。

但題目并沒說給的多變形就是凸多邊形。顯然如果是凸多邊形的話,直接用上面的方法計(jì)算即可。而對(duì)于凹多邊形凹的部分如果我們也像上面的做法那樣沿著城堡的邊建圍墻,頂點(diǎn)畫圓弧,然后兩者再加起來的話顯然是錯(cuò)誤的,因?yàn)槲覀冎纼牲c(diǎn)之間直線最短,這樣做得到的邊長(zhǎng)和顯然要大于兩點(diǎn)間的直線段的和!所以對(duì)于凹多邊形,我們的做法是用一條線段直接將凹下去兩點(diǎn)連起來,使之成為一個(gè)凸包。所以這樣題目就很簡(jiǎn)單了,直接用掃描法構(gòu)造凸包,將其中凹下去的部分舍掉即可。

?

還有一點(diǎn),凸多邊形的外角和等于360度,所以所有圓弧的部分加起來就是一個(gè)園。所以最后圍墻的最短周長(zhǎng)就是:構(gòu)造的凸多邊形的周長(zhǎng)+半徑為L(zhǎng)的園的周長(zhǎng)。

?

此題題目有點(diǎn)誤導(dǎo)人,題意已經(jīng)指出城堡的頂點(diǎn)以順時(shí)針給出,但實(shí)際的數(shù)據(jù)并不是按序給出的!所以先要自己排好序,再構(gòu)建凸包。(有點(diǎn)坑爹。。。害我WA了好幾次。。。)

AC 代碼:

View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 #define pi acos(-1) 7 #define eps 1e-8 8 using namespace std; 9 const int N=1005; 10 struct point{ 11 double x,y; 12 }pt[N]; 13 int con[N]; 14 int n,l,tot; 15 double dist(point a,point b){ 16 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 17 } 18 double xmult(point p0,point p1,point p2){ 19 double x1=p1.x-p0.x; 20 double y1=p1.y-p0.y; 21 double x2=p2.x-p0.x; 22 double y2=p2.y-p0.y; 23 return (x1*y2-x2*y1); 24 } 25 bool cmp(point a,point b){ 26 if(xmult(pt[0],a,b)>0||xmult(pt[0],a,b)==0&&(dist(a,pt[0])<dist(b,pt[0])))return true; 27 return false; 28 } 29 void graham(){ 30 sort(pt+1,pt+n,cmp); 31 tot=0; 32 con[tot++]=0; 33 con[tot++]=1; 34 for(int i=2;i<n;){ 35 if(tot<1||xmult(pt[con[tot-2]],pt[con[tot-1]],pt[i])>=0) 36 con[tot++]=i++; 37 else tot--; 38 } 39 con[tot]=0; 40 } 41 int main() 42 { 43 //freopen("in.txt","r",stdin); 44 int i,k; 45 double ans; 46 while(scanf("%d %d",&n,&l)!=EOF){ 47 k=n-1; 48 for(i=n-1;i>=0;i--){ 49 scanf("%lf %lf",&pt[i].x,&pt[i].y); 50 if(pt[i].y<pt[k].y||((pt[i].y==pt[k].y)&&(pt[i].x<pt[k].x))) 51 k=i; 52 } 53 if(k){ 54 swap(pt[0].x,pt[k].x); 55 swap(pt[0].y,pt[k].y); 56 } 57 graham(); 58 ans=0; 59 for(i=0;i<tot;i++) 60 ans+=dist(pt[con[i]],pt[con[i+1]]); 61 ans+=2*pi*l; 62 printf("%d\n",(int)(ans+0.5)); 63 } 64 return 0; 65 }

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/acmer-roney/archive/2012/09/04/2670534.html

總結(jié)

以上是生活随笔為你收集整理的wall poj 1113的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。