POJ 1113 wall (凸包)

解题思路:

 凸包的周长加上原的周长,最后四舍五入。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define LL long long 
using namespace std;
const int MAXN = 1000 + 10;
struct Point
{
	double x, y;
	Point(double x = 0, double y = 0) : x(x), y(y) {}
};
typedef Point Vector;
Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }
Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x * p, A.y * p); }
Vector operator / (Vector A, double p) { return Vector(A.x / p, A.y / p); }
bool operator < (const Point& a, const Point& b)
{
	return a.x < b.x || (a.x == b.x && a.y < b.y);
}
const double eps = 1e-10;
int dcmp(double x)
{
	if(fabs(x) < eps) return 0; 
	else return x < 0 ? -1 : 1;
}
bool operator == (const Point& a, const Point& b)
{
	return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}
double Dot(Vector A, Vector B) { return A.x * B.x + A.y * B.y; }
double Length(Vector A) { return sqrt(Dot(A, A)); }
double Angle(Vector A, Vector B) { return acos(Dot(A,B) / Length(A) / Length(B)); }
double Cross(Vector A, Vector B) { return A.x * B.y - A.y * B.x; }
int ConvexHull(Point* p, int n, Point* ch)
{
	sort(p, p+n);
	int m = 0;
	for(int i=0;i<n;i++)
	{
		while(m > 1 && Cross(ch[m-1] - ch[m-2], p[i] - ch[m-2]) <= 0) m--;
		ch[m++] = p[i];
	}
	int k = m;
	for(int i=n-2;i>=0;i--)
	{
		while(m > k && Cross(ch[m-1] - ch[m-2], p[i] - ch[m-2]) <= 0) m--;
		ch[m++] = p[i];
	}
	if(n > 1) m--;
	return m;
}
//Point p[MAXN], ch[MAXN];
double dis(Point A, Point B)
{
	double x = A.x - B.x;
	double y = A.y - B.y;
	return (double) sqrt(x *x  + y * y);
}
const double PI = acos(-1);
int main()
{
	int N , L;
	while(scanf("%d%d", &N, &L)!=EOF)
	{
		Point p[MAXN], ch[MAXN];
		for(int i=0;i<N;i++)
			scanf("%lf%lf", &p[i].x, &p[i].y);
		int m = ConvexHull(p, N, ch);
		double ans = 0.0;
		for(int i=0;i<m;i++)
		{
			if(i != m -1) ans += dis(ch[i], ch[i+1]);
			else ans += dis(ch[i], ch[0]);
		}
		ans += (double) 2 * PI * L;
		printf("%d\n", (int) (ans + 0.5));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值