POJ 3348 (凸包面积)

原创 2016年08月30日 22:46:57

给你n棵树,可以用这n棵树围一个圈,然后在圈里面可以养牛,每个牛需要50平方米的空间,问最多可以养多少牛?

其实就是求一个凸包,计算凸包面积,然后除以50,然后就得到答案,直接上模板。

凸包这一类型的题目差不多,可以作为模板使用,时间复杂度是NlogN。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
using namespace std;

struct POINT
{
	int x,y;
	double angle;
}point[10010],stack[10010];
int n, top;
typedef struct POINT Point;

//欧氏距离
double Distance(Point p1, Point p2)
{
	return sqrt((double)((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)));
}

//叉积 op_sp × op_ep
double multily(Point sp, Point ep, Point op)
{
	return (double)((sp.x - op.x) * (ep.y - op.y) - (ep.x - op.x) * (sp.y - op.y));
}

//比较函数从小到大
int cmp(const void *a, const void *b)
{
	Point *c = (Point *)a;
	Point *d = (Point *)b;
	if (c->angle > d->angle)
	{
		return 1;
	}
	else if(c->angle < d->angle)
	{
		return -1;
	}
	else
		return (c->x * c->x + c->y * c->y) < (d->x * d->x + d->y * d->y) ? -1 : 1;
}

//求凸包
void Graham_scan()
{
	int i;
	stack[0] = point[0];
	stack[1] = point[1];
	stack[2] = point[2];
	for (i = 3; i < n; ++ i)
	{
		while (multily(point[i], stack[top], stack[top - 1]) > 0)
		{
			top --;
		}
		stack[++ top] = point[i];
	}
}

//求出凸包的面积
double getArea1()
{
	double sum = 0.0;
	int i;
	for (i = 0; i <= top; ++ i)
	{
		sum += (double)(stack[i].x * stack[(i + 1) % (top + 1)].y - stack[i].y * stack[(i + 1) % (top + 1)].x);
	}
	return sum / 2.0;
}

int main()
{
	double area1;
	int i, k;

	while(scanf("%d", &n) != EOF)
	{
		top = 2;
		k = 0;

		for (i = 0; i < n; ++ i)
		{
			scanf("%d %d", &point[i].x, &point[i].y);
		}
		for (i = 1; i < n; ++ i)
		{
			if (point[i].y < point[k].y || (point[i].y == point[k].y && point[i].x < point[k].x))
			{
				k = i;
			}
		}
		if (k)
		{
			Point tmp = point[0];
			point[0] = point[k];
			point[k] = tmp;
		}

		for (i = 1; i < n; ++ i)
		{
			point[i].angle = atan2((double)(point[i].y - point[0].y), (double)(point[i].x - point[0].x));
		}
		qsort(point + 1, n - 1, sizeof(point[0]),cmp);
		Graham_scan();

		area1 = fabs(getArea1());
		printf("%d\n", (int)(area1/50.0));

	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 3348 Cows (凸包面积)

POJ 3348 Cows (凸包面积)

POJ 3348 Cows (凸包+多边形面积)

http://poj.org/problem?id=3348 大意:用已有的树围成最大的牧场来养牛,每头牛生活至少需要50平方米。求出能养多少头? 听说此题不难,然而我因为打错了一个变量看了一晚上...

POJ 3348 Cows (凸包面积)

http://poj.org/problem?id=3348 水。 完整代码: /*0ms,680KB*/ #include #include #include using namespac...

poj 3348(求凸包面积)

题意:一片草地上有n课树,现在你想用绳子圈出一个尽可能大的面积出来养牛。已知每只牛需要50单位的面积,问最多能养几只牛。 解题思路:凸包的面积。这里一般的思路就是先求出凸包,再以最低点为顶点...

poj3348Cows(凸包求多边形面积)

题目链接: http://poj.org/problem?id=3348 思路: 先对点进行排序,然后求出凸包。对凸包上的点进行面积计算,即将多边形面积分成多个三角形,利用叉积计算即可。 ...

POJ 3348 Cows(凸包面积)

Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7515   Accepted:...

poj3348-Cows 求凸包及其面积

凸包求面积

poj3348(求凸包的面积)graham算法。

Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7157   Accepted:...
  • modiz
  • modiz
  • 2015-03-20 11:58
  • 249

求凸包面积:poj3348

Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6299   Accepted: 2880 De...
  • modiz
  • modiz
  • 2014-05-05 20:25
  • 551

poj 3348 Cows(凸包+叉积求面积)

【题目大意】:给出一个多边形,求其凸包面积,答案/50取整输出 【解题思路】:水题,凸包模版+叉积求多边形面积 【代码】: #include #include #includ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)