| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
疯狂RE,求解!!用的是水平序的Graham_Scan
#include <iostream>
#include <cmath>
#include <algorithm>
const double PI=3.141592653;
using namespace std;
struct Pnt{
double x,y;
}P[3000];
int N;
double Len;
bool cmp(const Pnt &a,const Pnt &b){
return a.y<b.y || (a.y==b.y && a.x<b.x);
}
double CrossP(Pnt A,Pnt B,Pnt C){
return (B.y-A.y)*(C.x-A.x)-(B.x-A.x)*(C.y-A.y);
}
double Dist(Pnt A,Pnt B){
return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));
}
void Graham_Scan(){
int Stack[3000],Tail=1,i=2;
bool Visit[3000];
memset(Visit,false,sizeof(Visit));
Stack[0]=0;
Stack[1]=1;
while(i<=N-1){
if(CrossP(P[Stack[Tail-1]],P[Stack[Tail]],P[i])<=0)
Stack[++Tail]=i++;
else
Tail--;
}
for(i=1;i<=Tail;i++)
Visit[Stack[i]]=true;
i=N-2;
while(i>=0){
if(!Visit[i]){
if(CrossP(P[Stack[Tail-1]],P[Stack[Tail]],P[i])<=0)
Stack[++Tail]=i--;
else
Tail--;
}
else
i--;
}
double Ans=0;
if(N!=1){
for(int i=1;i<=Tail;i++)
Ans+=Dist(P[Stack[i]],P[Stack[i-1]]);
}
Ans+=2*PI*Len;
printf("%.lf\n",Ans);
}
int main(){
cin>>N>>Len;
for(int i=0;i<N;i++)
cin>>P[i].x>>P[i].y;
sort(P,P+N,cmp);
Graham_Scan();
system("pause");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator