poj3301--Texas Trip(最小正方形覆盖)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3301--Texas Trip(最小正方形覆盖)相关的知识,希望对你有一定的参考价值。
题目链接:点击打开链接
题目大意:给出n个点的坐标。如今要求一个正方形,全然包围n个点。而且正方形面积最小,求最小的正方形面积。
表示不能理解为什么面积随着角度的变化是一个单峰的函数,等待大牛告诉一下,,。
假设面积随角度变化是单峰的函数。那么自然就能够想到是三分,依照题目要求求正方形最小的面积,假设正方形是平行于x轴的,那么正方形面积是x的最大距离*y的最大的距离。然后旋转正方形。在0到90度内总会找到一个正方形面积的最小值,,,可是旋转正方形比較麻烦,我们能够考虑旋转坐标系,将做坐标系旋转0到90度。按旋转的角度又一次计算各点的坐标。然后找出x的差和y的差,计算面积。
由于是单峰的函数,所以用三分角度,找到一个最小的面积。
注意:三分的eqs要非常小,,。。,
角度旋转公式x = x*cos(j) - y*sin(j) ; y = x*sin(j) + y*cos(j) ;
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std ; #define eqs 1e-12 #define INF 0x3f3f3f3f #define PI acos(-1.0) struct node{ double x , y ; }p[35]; int n ; double maxx , minx , maxy , miny ; double f(double j) { int i ; double x , y ; maxx = maxy = -INF ; minx = miny = INF ; for(i = 0 ; i < n ; i++) { x = p[i].x*cos(j) - p[i].y*sin(j) ; y = p[i].x*sin(j) + p[i].y*cos(j) ; maxx = max(maxx,x) ; minx = min(minx,x) ; maxy = max(maxy,y) ; miny = min(miny,y) ; } return max( maxx-minx,maxy-miny ) ; } int main() { int t , i ; scanf("%d", &t) ; while( t-- ) { scanf("%d", &n) ; for(i = 0 ; i < n ; i++) { scanf("%lf %lf", &p[i].x, &p[i].y) ; } double low = 0.0 , mid1 , mid2 , high = PI/2.0; while( low + eqs < high ) { mid1 = (low + high)/2.0 ; mid2 = (mid1 + high) / 2.0 ; if( f(mid1) > f(mid2) ) low = mid1 ; else high = mid2 ; } low = f(low) ; printf("%.2lf\n", low*low ) ; } return 0 ; }
以上是关于poj3301--Texas Trip(最小正方形覆盖)的主要内容,如果未能解决你的问题,请参考以下文章
POJ-1734 Sightseeing trip(floyd求最小环)
POJ-1734 Sightseeing trip(floyd求最小环)
Sightseeing trip POJ - 1734 -Floyd 最小环
[POJ] John‘s trip | 欧拉回路 | 边序列字典序最小 + 建图