P2742 [USACO5.1]圈奶牛Fencing the Cows /模板二维凸包(计算几何)(凸包)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2742 [USACO5.1]圈奶牛Fencing the Cows /模板二维凸包(计算几何)(凸包)相关的知识,希望对你有一定的参考价值。

[USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包

题目传送门

输入样例

4
4 8
4 12
5 9.3
7 8

输出样例

12.00

解题思路

凸包模板题

AC代码

#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n,tot;
double ans;
struct node

	double x,y;
a[100005],q[100005];
double cj(node x1,node x2,node x3,node x4)

	return (x2.x-x1.x)*(x4.y-x3.y)-(x2.y-x1.y)*(x4.x-x3.x);

double juli(node x,node y)

	return 1.0*sqrt(1.0*(x.x-y.x)*(x.x-y.x)+1.0*(x.y-y.y)*(x.y-y.y));

bool cmp(node x,node y)

	double o=cj(a[1],x,a[1],y);
	if(o>0)return 1;
	if(!o&&juli(a[0],x)<juli(a[0],y))return 1;
	return 0;

int main()

	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	
		scanf("%lf%lf",&a[i].x,&a[i].y);
		if(a[i].y<a[1].y||(a[i].y==a[1].y&&a[i].x<a[1].x))//排序
		
			swap(a[i].x,a[1].x);
			swap(a[i].y,a[1].y);
		
	
	sort(a+2,a+n+1,cmp);
	q[++tot]=a[1];
	for(int i=2;i<=n;i++)
	
		while(tot>1&&cj(q[tot-1],q[tot],q[tot],a[i])<=0)tot--;
		q[++tot]=a[i];
	
	q[tot+1]=a[1];
	for(int i=1;i<=tot;i++)ans+=juli(q[i],q[i+1]);
	printf("%.2lf",ans);
	return 0;

谢谢

以上是关于P2742 [USACO5.1]圈奶牛Fencing the Cows /模板二维凸包(计算几何)(凸包)的主要内容,如果未能解决你的问题,请参考以下文章

P2742 [USACO5.1]圈奶牛Fencing the Cows /模板二维凸包(计算几何)(凸包)

P2742 [USACO5.1]圈奶牛Fencing the Cows

P2742 模板二维凸包 / [USACO5.1]圈奶牛Fencing the Cows

洛谷 P2742 [USACO5.1]圈奶牛Fencing the Cows

P2742 [USACO5.1]圈奶牛Fencing the Cows /模板二维凸包

P2742 模板二维凸包 / [USACO5.1]圈奶牛Fencing the Cows