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;
}