其他分享
首页 > 其他分享> > 洛谷P2742 Fencing the Cows

洛谷P2742 Fencing the Cows

作者:互联网

传送门

题解

二维凸包模板题。
使用简单迅速的 Graham Scan 算法可以直接求出整个凸包。算法流程:

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define xx first
#define yy second
using namespace std;
typedef long long LL;
typedef pair<double,double> PDD;
const int N=3e5+10;
const double PI=acos(-1.0);
int n,top;
PDD p[N],sta[N];
double ans;
double X(PDD a,PDD b,PDD c){
	return (b.xx-a.xx)*(c.yy-a.yy)-(c.xx-a.xx)*(b.yy-a.yy);
}
double len(PDD a,PDD b){
	return sqrt((a.xx-b.xx)*(a.xx-b.xx)+(a.yy-b.yy)*(a.yy-b.yy)); 
}
bool cmp(PDD a,PDD b){
	double pp=X(p[1],a,b);
	if(pp>0) return true;
	if(pp<0) return false;
	return len(p[1],a)<len(p[1],b);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lf%lf",&p[i].xx,&p[i].yy);
	if(n==1) return printf("0.00\n"),0;
	else if(n==2) return printf("%.2lf\n",len(p[1],p[2])),0;
	for(int i=1;i<=n;i++)
		if(p[i].yy<p[1].yy||p[i].yy==p[1].yy&&p[i].xx<p[1].xx)
			swap(p[i],p[1]);
	sort(p+2,p+n+1,cmp);
	sta[++top]=p[1];sta[++top]=p[2];
	for(int i=3;i<=n;i++){
		while(top>1&&X(sta[top-1],sta[top],p[i])<=0) top--;
		sta[++top]=p[i];
	}
	for(int i=1;i<top;i++) ans+=len(sta[i],sta[i+1]);
	ans+=len(sta[top],p[1]);
	printf("%.2lf\n",ans);
	return 0;
}

标签:P2742,include,Fencing,yy,xx,vec,double,Cows,PDD
来源: https://www.cnblogs.com/BakaCirno/p/12562900.html