cogs896. 圈奶牛

来源:互联网 发布:战争风云老僧扫矿软件 编辑:程序博客网 时间:2024/04/18 20:57

http://218.28.19.228/cogs/problem/problem.php?pid=896

#include<algorithm>#include<iostream>#include<cstdio>#include<cmath>struct point{double x,y;}p[10001],s[10001];double dis(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double mul(point p1,point p2,point p0){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}inline bool cmp(point a,point b){if(!mul(p[0],a,b))return dis(a,p[0])<dis(b,p[0]);else return mul(p[0],a,b)>0;}using namespace std;int n;double ans;void graham(){int top=2,k=0;point t;for(int i=1;i<n;i++)    if((p[k].y>p[i].y)||(p[k].y==p[i].y&&p[k].x>p[i].x))k=i;t=p[0];p[0]=p[k];p[k]=t;sort(p+1,p+n,cmp);s[0]=p[0],s[1]=p[1],s[2]=p[2];for(int i=3;i<n;i++){while(top&&mul(p[i],s[top],s[top-1])>=0)top--;s[++top]=p[i];}s[++top]=p[0];for(int i=0;i<top;i++)ans+=dis(s[i],s[i+1]);}int main(){freopen("fc.in","r",stdin);freopen("fc.out","w",stdout);scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);graham();printf("%.2f",ans);cin>>n;return 0;}


0 0
原创粉丝点击