POJ 3301 Texas Trip (三分)
题意 : 给你若干个点,让你找最小的正方形覆盖这所有的点。输出面积。
思路 : 三分枚举正方形两对边的距离,然后求出最大,本题用的是旋转正方形,也可以用旋转点,即点的相对位置不变。
正方形从0度到180度变化的过程中,把所有点覆盖,面积肯定是有一个最小峰值,是一个凸函数。因此可以用三分法解决。这里有一个难点就是已知两个定点的x,y坐标,过这两个点做两条平行线,平行线并与x轴成d度的角,怎么算出两条平行线的距离。
d1 = fabs(cos(d)*(yi-yj)-sin(d)*(xi-xj));
d2 = fabs*(sin(d)*(yi-yj)+cos(d)*(xi-xj));
#include <iostream>
#include <cstdio>
#include <cmath>
#define eps 1e-9 using namespace std; int T,n;
int x[],y[]; double calc(double d)
{
double dis1,dis2,dis;
dis = 0.0;
for(int i = ; i < n ; i ++)
{
for(int j = i+ ; 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]));
dis = max(dis,max(dis1,dis2) ) ;
}
}
return dis*dis;
}
int main()
{
double l,r,mid,midmid;
double s1,s2;
cin>>T;
for(int k = ; k < T ; k++)
{
cin>>n;
for(int i = ; i <= n ; i++)
cin>>x[i]>>y[i];
l = 0.0;
r = acos(-1.0)/;
while(r-l >= eps)
{
mid = (l + r) / ;
midmid = (mid + r) / ;
s1 = calc(mid) ;
s2 = calc(midmid) ;
if(s1 < s2)
r = midmid ;
else l = mid ;
}
printf("%.2lf\n",min(s1,s2));
}
return ;
}
三分算法解决凸形或者凹形函数的极值;
二分解决具有单调性的函数的极值;

mid = (Left + Right) / 2
midmid = (mid + Right) / 2;
如果mid靠近极值点,则Right = midmid;
否则(即midmid靠近极值点),则Left = mid;
程序模版如下:
double cal(Type a)
{
/* 根据题目的意思计算 */
}
void solve()
{
double Left, Right;
double mid, midmid;
double mid_value, midmid_value;
Left = MIN; Right = MAX;
while (Left + EPS <= Right)
{
mid = (Left + Right) / ;
midmid = (mid + Right) / ;
if (cal(mid)>=cal(midmid)) Right = midmid;
else Left = mid;
}
}
我搜索的三分算法的题目:HDU :3400 2298 4454 2438 3756
POJ: 3301 3737
ZOJ: 3203
POJ 3301 Texas Trip (三分)的更多相关文章
- 三分 --- POJ 3301 Texas Trip
Texas Trip Problem's Link: http://poj.org/problem?id=3301 Mean: 给定n(n <= 30)个点,求出包含这些点的面积最小的正方形 ...
- poj 3301 Texas Trip(几何+三分)
Description After a day trip with his friend Dick, Harry noticed a strange pattern of tiny holes in ...
- poj 3301 Texas Trip 三分法
思路:三分法求解凸函数的极值,三分法介绍在这:http://hi.baidu.com/czyuan_acm/item/81b21d1910ea729c99ce33db 很容易就可以推出旋转后的坐标: ...
- POJ 3301 Texas Trip
题目大意: 在二维坐标系中给出一些点.求能覆盖他们的最小正方形的面积(正方形的边不一定平行坐标轴) 解题思路: 对于一个点.若坐标轴旋转a度(弧度制).那么X'=X*cos(a)-Y*sin(a);Y ...
- POJ 3301:Texas Trip(计算几何+三分)
http://poj.org/problem?id=3301 题意:在二维平面上有n个点,每个点有一个坐标,问需要的正方形最小面积是多少可以覆盖所有的点. 思路:从第二个样例可以看出,将正方形旋转45 ...
- poj3301 Texas Trip【三分算法】
题目地址:http://poj.org/problem?id=3301 简述:T组测试数据,每组线输入n,代表有n个点,接下来输入这n个点的坐标,坐标都是整数. 要求用一个最小的正方形覆盖所有的点,输 ...
- POJ 3301 三分(最小覆盖正方形)
题意: 给你n个点,让你找一个最小的正方形去覆盖所有点.思路: 想一下,如果题目中规定正方形必须和x轴平行,那么我们是不是直接找到最大的x差和最大的y差取最大就行了,但是这个题目 ...
- POJ3301 Texas Trip 计算几何、随机化贪心
传送门--Vjudge 三分写法似乎有问题,可以去Udebug上看Morass的\(666\)个测试点的数据,我的乱搞有很多比正解答案小,但还是能在SPOJ和POJ过,可见数据之水. 可以对正方形的角 ...
- poj3301Texas Trip(三分)
链接 这题还真没看出来长得像三分.. 三分角度,旋转点. 最初找到所有点中最左边.右边.上边.下边的点,正方形边长为上下距离和左右距离的最大值,如图样例中的四个点(蓝色的),初始正方形为红色的正方形. ...
随机推荐
- hdu 1250 Hat's Fibonacci
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1250 Hat's Fibonacci Description A Fibonacci sequence ...
- golang的函数
在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http. ...
- IOS中GPS定位偏移纠正(适用于Google地图)
在这个神奇的国度里,我们总得学习一些有中国特色的东东,例如“火星坐标”.也许有人还不知道这是什么玩意,我就简要介绍一下吧. 如果你有带GPS模块的智能手机,打开定位功能,然后访问Google ...
- 使用AnkhSvn-2.5.12478.msi管理vs2013代码的工具安装步骤使用
安装好AnkhSvn后,按照上面红色画出来的图,进行操作: 需要安装的文件有: AnkhSvn-2.5.12478.msi LanguagePack_1.8.5.25224-x64-zh_CN.msi ...
- layer 弹出子页面然后给父页面赋值
//----赋值 并关闭当前页面 开始---- FunctionActionDeleteXZ = function (CompanyId, RelCompanyName) { parent.$(&qu ...
- 007--VS2013 C++ 显示位图半透明化
以后所有图片都放在根目录下: 如有另放,会特别注明 //全局变量HBITMAP bg,girl;HDC mdc; //起始坐标const int xstart = 50;const int ystar ...
- 防止被dylib hook的小技巧
在Build Settings中找到“Other Linker Flags”在其中加上”-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null”即可.
- 自定义 tabBar (默认 tabBar 为可读不可写类型)
KVC 方法 //由于 tabBar是只读 不能够直接操作,如果要修改 可以使用KVC let mainTabBar = MainTabBar() //KVC 赋值 setValue(mainTab ...
- 软件工程随堂小作业——寻找“水桶”(C++)
一.设计思想 思路与寻找一个水王相似,这次只是计数器和嫌疑人变量都设置为数组.每次选取一个ID与三个嫌疑人比较,若有相同则计数:若三个都不相同,则三个计数器都减一.若减为0,则从新赋值给嫌疑人. 二. ...
- 四则运算出题器(c++)
一.设计思路 这次版本加入了一下功能: 可定制题目的数量:修改循环次数: 可以定制每行打印的题目数和行间距的大小(当前题目序号可以整除定制数时输出输入的行间距个换行符): 可以定制算式的范围(修改随机 ...