[POJ3384]Feng Shui(半平面交+凸包)
题目:
我是超链接
题意:
在一个凸多边形中放两个半径固定的圆,要求输出使覆盖面积最大的(可重叠)两个圆圆心
题解:
Emmm。。。套路缩小凸多边形,形成的凸包是圆心可以在的位置,然后暴力找最远点!
不知道为什么nlogn的半平面交过不了(说不定是spj的锅)
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 10005
const double pi=acos(-1.0);
const double inf=1e9;
const double eps=1e-12;
int dcmp(double x)
{if (x<=eps&&x>=-eps) return 0;return (x>0)?1:-1;
}
struct Vector
{double x,y;Vector(double X=0,double Y=0){x=X,y=Y;}
};
typedef Vector Point;
Vector operator + (Vector a,Vector b) {return Vector(a.x+b.x,a.y+b.y);}
Vector operator - (Vector a,Vector b) {return Vector(a.x-b.x,a.y-b.y);}
Vector operator * (Vector a,double p) {return Vector(a.x*p,a.y*p);}int n,cnt,ncnt,ansi,ansj;
double x,y,r,ans;
Point p[N],poly[N],npoly[N];double Dot(Vector a,Vector b)
{return a.x*b.x+a.y*b.y;
}
double Cross(Vector a,Vector b)
{return a.x*b.y-a.y*b.x;
}
double Len(Vector a)
{return sqrt(Dot(a,a));
}
Vector rotate(Vector a,double rad)
{return Vector(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
}
bool insLS(Point A,Point B,Point C,Point D)
{Vector v=B-A,w=C-A,u=D-A;return dcmp(Cross(v,w))!=dcmp(Cross(v,u));
}
Point GLI(Point P,Vector v,Point Q,Vector w)
{Vector u=P-Q;double t=Cross(w,u)/Cross(v,w);return P+v*t;
}
void init()
{cnt=0;poly[++cnt]=Point(-inf,-inf);poly[++cnt]=Point(inf,-inf);poly[++cnt]=Point(inf,inf);poly[++cnt]=Point(-inf,inf);
}
void halfp(Point A,Point B)
{ncnt=0;Point C,D;for (int i=1;i<=cnt;++i){C=poly[i];D=poly[i%cnt+1];if (dcmp(Cross(B-A,C-A))>=0)npoly[++ncnt]=C;if (insLS(A,B,C,D))npoly[++ncnt]=GLI(A,B-A,C,D-C);}cnt=ncnt;for (int i=1;i<=cnt;++i)poly[i]=npoly[i];
}
int main()
{scanf("%d%lf",&n,&r);for (int i=1;i<=n;++i){scanf("%lf%lf",&x,&y);p[i]=Point(x,y);}init();for (int i=1;i<=n;++i){Point A=p[i];Point B=p[i%n+1];Vector w=rotate(A-B,pi/2.0);w=w*(r/Len(w));halfp(B+w,A+w);}ansi=ansj=1;for (int i=1;i<=cnt;++i)for (int j=i+1;j<=cnt;++j){double dis=Len(poly[i]-poly[j]);if (dcmp(dis-ans)>0){ans=dis;ansi=i,ansj=j;}}printf("%.4lf %.4lf %.4lf %.4lf\n",poly[ansi].x,poly[ansi].y,poly[ansj].x,poly[ansj].y);
}
[POJ3384]Feng Shui(半平面交+凸包)相关推荐
- CodeForces - Feng Shui(半平面交)
题目链接:http://codeforces.com/gym/101650/attachments Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- POJ 3384 Feng Shui(半平面交)
题意 : 给你一个凸多边形,让你在其中找两个圆,使得圆的覆盖面积最大. 这个题目和 poj 3525 有点类似,那个题目是一个圆,想到两者的联系,可以发现两个圆覆盖面积最大就是重叠面积最小,怎样使得重 ...
- BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包
发现需要求一个下凸的半平面上有几个交点. 然后我们把它变成凸包的问题. 好写.好调.还没有精度误差. #include <map> #include <ctime> #incl ...
- Feng Shui POJ - 3384 [半平面交]
Feng Shui POJ - 3384 题意:n个顶点的凸包,放入2个半径为r的圆,可以重叠,要求面积最大,输出2个圆的圆心坐标(保留4位小数) 思路:找出圆心的可行域(内推r,求半平面交),再求核 ...
- POJ - 3384 Feng Shui(半平面交)
链接 Feng Shui 题意 将两个半径为 rrr 的圆放入一个多边形中,两个圆占据最大面积时圆心坐标是多少: 思路 在多边形中放圆,最大圆的圆心一定在多边形内核中: 将多边形的每条边都内推 rrr ...
- [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...
- HDU 6617 Enveloping Convex(凸包+半平面交+二分)
首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...
- 半平面交练习(计算几何)
四:半平面交 Rotating Scoreboard /*Author : lifehappy */ #include <cstdio> #include <cmath> #i ...
- UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)
整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...
最新文章
- 【机器视觉】 dev_open_file_dialog算子
- 安卓MediaPlayer框架之Binder机制
- 【echarts】echarts开发流程详解
- 学PHP的嫌弃什么歌,抖音再见了互相嫌弃的老同学是什么歌
- REVERSE-PRACTICE-BUUCTF-13
- POJ 1095 Trees Made to Order
- c语言糖果游戏,幼儿园小班糖果游戏教案
- 【递归,Java从入门到精通第五版pdf百度云
- Matlab输出所有汉字(Unicode)
- Linux ——vi / vim 新建文件vi abc.txt 、编辑文件 i、退出编辑 esc、保存文件:wq、打开文件所在目录 open . 、使用命令打开文件 open ./abc.txt。
- 推荐 5 个免费高品质的图片资源网站
- 手机上怎么把图片转成PDF?操作起来很简单
- Kibana 7.13.2 启动时报错 TaskManager is unable to start as there the Kibana UUID is invalid
- 什么是登陆器劫持登陆器劫持怎么办GOM引擎的登陆器会被劫持吗
- C语言strcpy()函数,字符数组复制
- H3C服务器带外默认账号和密码
- 嵌套列表与列表推导式
- 谈谈ali与Google的Java开发规范
- Android多行文本折叠展开效果
- 手机如何连无线打印服务器,手机可以直接连接打印机打印东西吗?需要怎么做?...