poj3301 Texas Trip【三分算法】

题目地址:http://poj.org/problem?id=3301

简述:T组测试数据,每组线输入n,代表有n个点,接下来输入这n个点的坐标,坐标都是整数。

要求用一个最小的正方形覆盖所有的点,输出它的面积,精确到小数点后两位。

算法思路:枚举角度,计算面积, 三分枚举

(可参考:程序设计 解题策略  吴永辉...著 394页)

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <stack>
#include <queue>
#include <iostream>
#include <string>
#include <algorithm>
#define eps 1e-9

using namespace std;

int tg, n;
int x[1000], y[1000];

double calc(double d)
{
	int i, j;
	double dis1,dis2,dis;
	dis=0.0;

	for(i=1; i<n; i++)
	{
		for(j=i+1; j<=n; j++)
		{
			dis1=fabs( cos(d)*(y[i]-y[j])-sin(d)*(x[i]-x[j]) );
			dis2=fabs( sin(d)*(y[i]-y[j])+cos(d)*(x[i]-x[j]) );
			if(dis < dis1 ) dis = dis1;
			if(dis < dis2 ) dis = dis2;
		}
	}
	return (dis*dis);
}

int main()
{
    double ll, rr, mid, midmid;
	double s1, s2;

	cin>>tg;
	while(tg--)
	{
		cin>>n;
		for(int i=1; i<=n; i++){
			cin>>x[i]>>y[i];
		}

		ll=0.0; rr=acos(-1.0); //rr=180.0 确定好区间
		while( rr-ll>=eps )
		{
			mid = (ll+rr)/2; midmid=(rr+mid)/2;

			s1=calc(mid);
			s2=calc(midmid);
			if(s1<s2){
				rr=midmid;
			}else
			{
				ll=mid;
			}
		}
		printf("%0.2lf\n", s1<s2?s1:s2);
	}
    return 0;
}
时间: 2024-08-04 03:39:17

poj3301 Texas Trip【三分算法】的相关文章

POJ 3301 Texas Trip (三分)

题目链接 题意 : 给你若干个点,让你找最小的正方形覆盖这所有的点.输出面积. 思路 : 三分枚举正方形两对边的距离,然后求出最大,本题用的是旋转正方形,也可以用旋转点,即点的相对位置不变. 正方形从0度到180度变化的过程中,把所有点覆盖,面积肯定是有一个最小峰值,是一个凸函数.因此可以用三分法解决.这里有一个难点就是已知两个定点的x,y坐标,过这两个点做两条平行线,平行线并与x轴成d度的角,怎么算出两条平行线的距离. d1 = fabs(cos(d)*(yi-yj)-sin(d)*(xi-x

三分 --- POJ 3301 Texas Trip

Texas Trip Problem's Link:   http://poj.org/problem?id=3301 Mean: 给定n(n <= 30)个点,求出包含这些点的面积最小的正方形的面积. analyse: 首先要确定的是旋转的角度在0到180度之间即可,超过180度是和前面的相同的. 坐标轴旋转后,坐标变换为: X’ = x * cosa - y * sina; y’ = y * cosa + x * sina; Time complexity: O(n) Source code

POJ 3301 Texas Trip

题目链接:http://poj.org/problem?id=3301 Texas Trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4935 Accepted: 1543 Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in the door of his SUV. The

三分算法

三分算法 二分算法解决的是具有单调性的问题. 三分算法解决的是抛物线的类型,上凸,下凹. mid=(Left+Right)/2; midmid=(Right+mid)/2; 题目类型有: HDU :3400  2298  4454  2438  3756 POJ:  3301   3737 ZOJ: 3203

poj3301Texas Trip(三分)

链接 这题还真没看出来长得像三分.. 三分角度,旋转点. 最初找到所有点中最左边.右边.上边.下边的点,正方形边长为上下距离和左右距离的最大值,如图样例中的四个点(蓝色的),初始正方形为红色的正方形. 当4个点旋转了一定角度之后,根据上下及左右的最大距离可以画出蓝色的正方形,而且现在的正方形更小,可以看出角度最大为pi/2即可. 至于为什么是三分..大家都说是三分..感觉是个三分..画起来的确是个凸性函数..三分交上AC了!..所以就是三分吧. 1 #include <iostream> 2

二分算法和三分算法

二分算法: hdu1969    PIE 题意:f+1个人分n分pie,pie只能切开不能从组,也就是说每个人拿到的必须是一个整块,不能是多个碎块.要求每个人分的的大小一样.n份pie的大小不同.目标是求出没人可能吃到的最大大小V. 分析抽象:首先条件是必须够n个人吃,要求大小一样的情况下求最大的V.关系是随着V的增大,所能support的人越少.这里有一个非递增的关系.所以而已考虑二分法.问题对精度的要求是二分法使用的关键.要求保留4位小数,所以我们统一乘上1000000来计算. #inclu

hihocoder 1142 三分求极值【三分算法 模板应用】

#1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 提示:三分法 输入 第1行:5个整数a,b,c,x,y.前三个数构成抛物线的参数,后两个数x,y表示P点坐标.-200≤a,b,c,x,y≤200 输出 第1行:1个实数d,保留3位小数(四舍五入) 样例输入 2 8 2 -2 6 样例输出 2.437

HDU 4355 Party All the Time 三分算法

HDU 4355 Party All the Time 三分算法 题意 给你N个人的位置x和相应重量w,他们要到达同一个位置p,他们每个人的花费的精力等于\(|s[i]-p|^{3}*w\),然后我们需要求一个位置,使得所有人的花费之和最小. 解题思路 根据上面的公式,我们可以知道这个函数不是一个简单的单调函数,最起码是个凹函数(这里需要一个数学上的知识),对于一般情况我们会使用二分法来进行处理,但是这里不是单调函数了,而是一个凹函数,这样我们就不能用二分了,新的算法应运而生--三分算法. 三分

poj 3301 Texas Trip(几何+三分)

Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in the door of his SUV. The local American Tire store sells fiberglass patching material only in square sheets. What is the smallest patch that Harry nee