poj3301--Texas Trip(最小正方形覆盖)
2015-08-06 19:14
127 查看
题目链接:点击打开链接
题目大意:给出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 ;
}
题目大意:给出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 ;
}
相关文章推荐
- MySQL IN用法
- 【费用流】 HDOJ 5352 MZL's City
- Linux 下 安装Mysql
- 听课练习(四)
- 《乌合之众》思维导图及优秀读后感
- sql关于Group by
- 欧拉通路-Play on Words
- 解决NDK开发中Eclipse报错“Unresolved inclusion jni.h”的最终方法
- 欧拉通路-Play on Words 分类: POJ 图论 2015-08-06 19:13 4人阅读 评论(0) 收藏
- ASP.NET CSS 小结
- C#高级编程七十五天----C#使用指针
- iOS 设置导航栏的主题
- 站长工具
- Activity的启动模式
- 学习相关:构建maven spring mvc
- 数字转化为特定格式的字符串
- codeforce Gym 100342H Hard Test (思考题)
- 我的第一篇博客——开篇
- 领导基础课程
- 实现电话、或电邮、或电话号码的登陆