poj1113Wall 求凸包周长 Graham扫描法

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef pair<int ,int > ll;
ll num,dot[1010];
int i;
const double pi=3.1415926535898;
ll operator -(ll a,ll b)
{
	return make_pair(a.first-b.first,a.second-b.second);
}
bool cmp(ll a,ll b)
{
	return (a.first!=b.first?a.first<b.first:a.second<b.second);
}
int cross(ll a,ll b)
{
	return a.first*b.second-b.first*a.second;
}
int d2(ll a,ll b)
{
	return (a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second);
}
double d1(ll a,ll b)
{
	return sqrt((double)d2(a,b));
}
bool cmp1(ll a,ll b)
{
	int r=cross(a-dot[0],b-dot[0]);
	return (r!=0?r>0:d2(a,dot[0])<d2(b,dot[0]));
}
void in()
{
	cin>>num.first>>num.second;
	for(i=0;i<num.first;i++)
		cin>>dot[i].first>>dot[i].second;
}
void work()
{
	sort(dot,dot+num.first,cmp);
	sort(dot,dot+num.first,cmp1);

	ll box[1010]={dot[0],dot[1]};
	int tail=1;
	for(i=2;i<num.first;)
	{
		if(cross(box[tail]-box[tail-1],dot[i]-box[tail-1])>=0)
			box[++tail]=dot[i++];
		else
			tail--;
	}

	double ans=d1(box[0],box[tail])+2*pi*num.second;
	for(i=0;i<tail;i++)
		ans+=d1(box[i],box[i+1]);
	printf("%.0lf\n",ans);
}
int main()
{
	in();
	work();
}

poj1113Wall 求凸包周长 Graham扫描法,布布扣,bubuko.com

时间: 2024-10-25 00:40:58

poj1113Wall 求凸包周长 Graham扫描法的相关文章

POJ 1113 Wall(Graham求凸包周长)

题目链接 题意 : 求凸包周长+一个完整的圆周长. 因为走一圈,经过拐点时,所形成的扇形的内角和是360度,故一个完整的圆. 思路 : 求出凸包来,然后加上圆的周长 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <cmath> 5 #include <algorithm> 6 7 const double PI = acos(-1.0) ;

Wall---hdu1348(求凸包周长 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 求凸包周长+2*PI*L #include <stdio.h> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int N = 110; const double eps = 1e-6; const double PI = acos(-1

HDU 1392 Surround the Trees (Graham求凸包周长)

题目链接 题意 : 让你找出最小的凸包周长 . 思路 : 用Graham求出凸包,然后对每条边求长即可. Graham详解 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <math.h> 5 #include <algorithm> 6 7 using namespace std ; 8 9 struct point 10 { 11 int

poj1873(二进制枚举+求凸包周长)

题目链接:https://vjudge.net/problem/POJ-1873 题意:n个点(2<=n<=15),给出n个点的坐标(x,y).价值v.做篱笆时的长度l,求选择哪些点来做篱笆围住另一些点,使得选出的这些点的价值和最小,如果价值和相等要求个数最小. 思路: 看来这是WF的签到题吧.数据很小,直接二进制枚举 (1<<n),然后对未选出的点求凸包的周长,仅当选出点的长度l的和>=凸包周长时才更新答案. AC code: #include<cstdio>

HDU 1392.Surround the Trees【凸包(求凸包周长)】【5月10】

Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9790    Accepted Submission(s): 3763 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to

Wall - POJ 1113(求凸包)

题目大意:给N个点,然后要修建一个围墙把所有的点都包裹起来,但是要求围墙距离所有的点的最小距离是L,求出来围墙的长度. 分析:如果没有最小距离这个条件那么很容易看出来是一个凸包,然后在加上一个最小距离L,那么就是在凸包外延伸长度为L,如下图,很明显可以看出来多出来的长度就是半径为L的圆的周长,所以总长度就是凸包的周长+半径为L的圆的周长. 代码如下: -------------------------------------------------------------------------

LightOJ 1239 - Convex Fence 凸包周长

LINK 题意:类似POJ的宫殿围墙那道,只不过这道题数据稍微强了一点,有共线的情况 思路:求凸包周长加一个圆周长 /** @Date : 2017-07-20 15:46:44 * @FileName: LightOJ 1239 求凸包.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <stdi

[codevs 1298] 凸包周长 [codevs 3201] 奶牛代理商 XI

题解: 今天开始学习计算几何. 这是一道计算几何求凸包周长的模板题,采用Andrew算法. 第二道题改下输出即可. 最后凸包周长的求法注意第一个点和最后一个点是同一个. 代码 100ms 3MB #include<cstdio> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int maxn = 100000 + 10; int n; struc

HDU 1392 Surround the Trees (凸包周长)

题目链接:HDU 1392 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope to surround all these trees. So at first he must know the minimal required length of the rope. However, he does not know how to calculate it. Can you