poj 1113 Wall

#include <iostream>
#include
<algorithm>
#include
<cmath>
#define PI 3.1415926
using namespace std;
struct point
{
int x,y;
}st;
point castle[
1005];
double dis(point a,point b)
{
return sqrt(pow(a.x-b.x+0.0,2.0)+pow(a.y-b.y+0.0,2.0));
}
int cmp(const point& a,const point& b)
{
if((b.x-st.x)*(a.y-st.y)==(a.x-st.x)*(b.y-st.y))
return dis(st,a)<dis(st,b);
else
return (b.x-st.x)*(a.y-st.y)<(a.x-st.x)*(b.y-st.y);
}
bool left(point a,point b,point c)
//a,b,c分别为 castle[s[t-1]],castle[s[t]],castle[i],
//如果直线ac的斜率大于ab的斜率,则说明从ab到ac做左转,即ac在ab的逆时针方向
{
return (c.y-a.y)*(b.x-a.x) >= (b.y-a.y)*(c.x-a.x); //(c.y-a.y)/(c.x-a.x) > (b.y-a.y)/(b.x-a.x)
//要特别注意=的情况,相等说明c在直线ab上,判断左转时这种同直线的情况也要考虑,若只是 > ,则 RE
}
int main()
{
int n,l,idx=0;
cin
>>n>>l;
for(int i=0;i<n;++i)
{
cin
>>castle[i].x>>castle[i].y;
if(castle[i].y<castle[idx].y||(castle[i].y==castle[idx].y&&castle[i].x<castle[idx].x))
idx
=i;
}
st.x
=castle[idx].x;st.y=castle[idx].y;
sort(castle,castle
+n,cmp);
int t=-1;
int s[1005];
s[
++t]=0;s[++t]=1;s[++t]=2;
for(int i=3;i<n;++i)
{
while(!left(castle[s[t-1]],castle[s[t]],castle[i]))
--t;
s[
++t]=i;
}
double len=0;
for(int i=1;i<=t;++i)
len
+=dis(castle[s[i-1]],castle[s[i]]);
len
+=dis(castle[s[0]],castle[s[t]])+2*l*PI;
printf(
"%.0f\n",len);
return 0;
}

  

posted on 2011-07-22 14:49  sysu_mjc  阅读(112)  评论(0编辑  收藏  举报

导航