题目:

我是超链接

题意:

在一个凸多边形中放两个半径固定的圆,要求输出使覆盖面积最大的(可重叠)两个圆圆心

题解:

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(半平面交+凸包)相关推荐

  1. CodeForces - Feng Shui(半平面交)

    题目链接:http://codeforces.com/gym/101650/attachments Time Limit: 2000MS Memory Limit: 65536K Descriptio ...

  2. POJ 3384 Feng Shui(半平面交)

    题意 : 给你一个凸多边形,让你在其中找两个圆,使得圆的覆盖面积最大. 这个题目和 poj 3525 有点类似,那个题目是一个圆,想到两者的联系,可以发现两个圆覆盖面积最大就是重叠面积最小,怎样使得重 ...

  3. BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包

    发现需要求一个下凸的半平面上有几个交点. 然后我们把它变成凸包的问题. 好写.好调.还没有精度误差. #include <map> #include <ctime> #incl ...

  4. Feng Shui POJ - 3384 [半平面交]

    Feng Shui POJ - 3384 题意:n个顶点的凸包,放入2个半径为r的圆,可以重叠,要求面积最大,输出2个圆的圆心坐标(保留4位小数) 思路:找出圆心的可行域(内推r,求半平面交),再求核 ...

  5. POJ - 3384 Feng Shui(半平面交)

    链接 Feng Shui 题意 将两个半径为 rrr 的圆放入一个多边形中,两个圆占据最大面积时圆心坐标是多少: 思路 在多边形中放圆,最大圆的圆心一定在多边形内核中: 将多边形的每条边都内推 rrr ...

  6. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  7. HDU 6617 Enveloping Convex(凸包+半平面交+二分)

    首先对于这m个点维护出一个凸包M,那么问题就变成了判断凸包P进行放大缩小能不能包含凸包M.(凸包P可以进行中心对称变换再进行放大缩小,见题意) 如何判断合适的相似比呢,我们可以用二分去放大缩小凸包P的 ...

  8. 半平面交练习(计算几何)

    四:半平面交 Rotating Scoreboard /*Author : lifehappy */ #include <cstdio> #include <cmath> #i ...

  9. UVA1396 Most Distant Point from the Sea(AM - ICPC - Tokyo - 2007)(计算几何,半平面交 + 二分答案)

    整理的算法模板合集: ACM模板 题目传送门 见<训练指南>P279 很明显就是一个二分答案,它问的是最远的点,直接枚举因为这里都是double类型的数所以有无限个点,我们可以直接二分. ...

最新文章

  1. 【机器视觉】 dev_open_file_dialog算子
  2. 安卓MediaPlayer框架之Binder机制
  3. 【echarts】echarts开发流程详解
  4. 学PHP的嫌弃什么歌,抖音再见了互相嫌弃的老同学是什么歌
  5. REVERSE-PRACTICE-BUUCTF-13
  6. POJ 1095 Trees Made to Order
  7. c语言糖果游戏,幼儿园小班糖果游戏教案
  8. 【递归,Java从入门到精通第五版pdf百度云
  9. Matlab输出所有汉字(Unicode)
  10. Linux ——vi / vim 新建文件vi abc.txt 、编辑文件 i、退出编辑 esc、保存文件:wq、打开文件所在目录 open . 、使用命令打开文件 open ./abc.txt。
  11. 推荐 5 个免费高品质的图片资源网站
  12. 手机上怎么把图片转成PDF?操作起来很简单
  13. Kibana 7.13.2 启动时报错 TaskManager is unable to start as there the Kibana UUID is invalid
  14. 什么是登陆器劫持登陆器劫持怎么办GOM引擎的登陆器会被劫持吗
  15. C语言strcpy()函数,字符数组复制
  16. H3C服务器带外默认账号和密码
  17. 嵌套列表与列表推导式
  18. 谈谈ali与Google的Java开发规范
  19. Android多行文本折叠展开效果
  20. 手机如何连无线打印服务器,手机可以直接连接打印机打印东西吗?需要怎么做?...

热门文章

  1. Linux之磁盘信息查看
  2. ubuntu各种实用的软件
  3. bios基本输入输出系统
  4. 【Flink】学习笔记-20200302更新
  5. Linux kfifo 源码分析
  6. 电商平台接入第三方支付接口之微信支付接入订单系统
  7. PAT乙级测试题1024(C语言实现)
  8. 想当程序员,如何判断自己是否适合当前端程序员?
  9. Ispell in Emacs
  10. Pandas返回时间戳的差,以秒为单位