您的位置:首页 > Web前端

[luogu2742]:[USACO5.1]圈奶牛Fencing the Cows

2017-12-04 14:52 579 查看
传送门

突然心血来潮开始搞计算几何。。

首先肯定是凸包。。

直接贴代码吧。。。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
inline int read(){
int x=0;char ch=' ';int f=1;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
const int N=1e4+5;
const double eps=1e-12;
struct Point{
double x,y;
Point(){}
Point(double _x,double _y):x(_x),y(_y){}
}p
;
inline bool operator == (const Point& a,const Point& b){
return fabs(a.x-b.x)<eps && fabs(a.y-b.y)<eps;
}
inline Point operator - (const Point& a,const Point& b){
return Point(a.x-b.x,a.y-b.y);
}
inline double operator * (const Point& a,const Point& b){
return (a.x*b.y)-(a.y*b.x);
}
inline bool cmp(const Point& a,const Point& b){
if(fabs(a.x-b.x)<eps)return a.y<b.y;
return a.x<b.x;
}
inline double slope(const Point& a,const Point& b){
return (b.y-a.y)/(b.x-a.x);
}
inline double dis(const Point& a,const Point& b){
return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}
int n,s1
,s2
,top,len;
int main(){
n=read();
for(int i=1;i<=n;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
sort(p+1,p+n+1,cmp);
s1[++top]=1;s1[++top]=2;
for(int i=3;i<=n;i++){
while(top>1 && (p[i]-p[s1[top]])*(p[s1[top]]-p[s1[top-1]])>0)top--;
s1[++top]=i;
}
len=top;
top=0;
s2[++top]=n;s2[++top]=n-1;
for(int i=n-2;i>=1;i--){
while(top>1 && (p[i]-p[s2[top]])*(p[s2[top]]-p[s2[top-1]])>0)top--;
s2[++top]=i;
}
double ans=0;
for(int i=1;i<len;i++)ans+=dis(p[s1[i]],p[s1[i+1]]);
for(int i=1;i<top;i++)ans+=dis(p[s2[i]],p[s2[i+1]]);
printf("%.2lf",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: