题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=332

题意:逆时针给出一个凸包,给凸包的最大内接圆半径。

思路:nlogn的算法:

(1)二分内切圆半径的值R

(2)把每个半平面向内平移R的长度

(3)使用一个双端队列(deque),依次向首部加入hplane[0],hplane[1],

for(i=2;i<num_hplane;i++)

{

while(deque顶端的两个半平面的交点在hplane[i]外)  删除deque顶端

while(deque底部的两个半平面的交点在hplane[i]外)  删除deque底部

将hplane[i]加入deque顶端

}

while(deque顶端的两个半平面的交点在底部半平面外) 删除deque顶端

while(deque底部的两个半平面的交点在顶端半平面外) 删除deque底部

判断最后剩下的半平面是否在3个以上

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <map>#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>=0?(x):-(x))
#define i64 long long
#define u32 unsigned int
#define u64 unsigned long long
#define clr(x,y) memset(x,y,sizeof(x))
#define CLR(x) x.clear()
#define ph(x) push(x)
#define pb(x) push_back(x)
#define Len(x) x.length()
#define SZ(x) x.size()
#define PI acos(-1.0)
#define sqr(x) ((x)*(x))
#define MP(x,y) make_pair(x,y)
#define EPS 1e-5#define FOR0(i,x) for(i=0;i<x;i++)
#define FOR1(i,x) for(i=1;i<=x;i++)
#define FOR(i,a,b) for(i=a;i<=b;i++)
#define DOW0(i,x) for(i=x;i>=0;i--)
#define DOW1(i,x) for(i=x;i>=1;i--)
#define DOW(i,a,b) for(i=a;i>=b;i--)
using namespace std;void RD(int &x){scanf("%d",&x);}
void RD(i64 &x){scanf("%I64d",&x);}
void RD(u32 &x){scanf("%u",&x);}
void RD(double &x){scanf("%lf",&x);}
void RD(int &x,int &y){scanf("%d%d",&x,&y);}
void RD(i64 &x,i64 &y){scanf("%I64d%I64d",&x,&y);}
void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);}
void RD(double &x,double &y){scanf("%lf%lf",&x,&y);}
void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);}
void RD(i64 &x,i64 &y,i64 &z){scanf("%I64d%I64d%I64d",&x,&y,&z);}
void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);}
void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);}
void RD(char &x){x=getchar();}
void RD(char *s){scanf("%s",s);}
void RD(string &s){cin>>s;}void PR(int x) {printf("%d\n",x);}
void PR(i64 x) {printf("%I64d\n",x);}
void PR(u32 x) {printf("%u\n",x);}
void PR(double x) {printf("%.6lf\n",x);}
void PR(char x) {printf("%c\n",x);}
void PR(char *x) {printf("%s\n",x);}
void PR(string x) {cout<<x<<endl;}const int N=10005;int DB(double x)
{if(x>EPS) return 1;if(x<-EPS) return -1;return 0;
}class point
{
public:double x,y;point(){}point(double _x,double _y){x=_x;y=_y;}point operator+(point a){return point(x+a.x,y+a.y);}point operator-(point a){return point(x-a.x,y-a.y);}double operator*(point a){return x*a.y-y*a.x;}point operator*(double t){return point(x*t,y*t);}double operator^(point a){return x*a.x+y*a.y;}point operator/(double t){return point(x/t,y/t);}double getLen(){return sqrt(x*x+y*y);}void get(){RD(x,y);}int operator==(point a){return DB(x-a.x)==0&&DB(y-a.y)==0;}int operator<(point a){if(DB(x-a.x)) return x<a.x;return y<a.y;}point adjust(double L){double temp=getLen();return point(x*L/temp,y*L/temp);}void print(){printf("%.6lf %.6lf\n",x,y);}
};class Vector
{
public:point s,t;double ang;Vector(){}Vector(point _s,point _t){s=_s;t=_t;ang=atan2(t.y-s.y,t.x-s.x);}};Vector a[N],b[N],st[N];
point p[N];
int n;double cross(point a,point b,point p)
{return (b-a)*(p-a);
}int in(point p,Vector a)
{return cross(a.s,a.t,p)>0;
}point getCross(Vector a,Vector b)
{double s1=(a.s-b.s)*(a.t-b.s);double s2=(a.t-b.t)*(a.s-b.t);return (b.s*s2+b.t*s1)/(s1+s2);
}Vector move(Vector a,double L)
{point d=point(a.s.y-a.t.y,a.t.x-a.s.x);d=d.adjust(L);return Vector(a.s+d,a.t+d);
}int cmp(Vector a,Vector b)
{return a.ang<b.ang;
}int OK(double L)
{int i;FOR1(i,n) b[i]=move(a[i],L);int head=1,tail=1;st[1]=b[1];for(i=2;i<=n;i++){while(tail>head&&!in(getCross(st[tail-1],st[tail]),b[i])) tail--;while(tail>head&&!in(getCross(st[head],st[head+1]),b[i])) head++;st[++tail]=b[i];}while(tail>head&&!in(getCross(st[tail],st[tail-1]),st[head])) tail--;while(tail>head&&!in(getCross(st[head],st[head+1]),st[tail])) head++;return tail>head+1;
}int main()
{RD(n);int i;FOR1(i,n) p[i].get();p[0]=p[n];FOR1(i,n) a[i]=Vector(p[i-1],p[i]);double low=0,high=1e8,mid;while(DB(low-high)==-1){mid=(low+high)/2;if(OK(mid)) low=mid;else high=mid;}PR(mid);return 0;
}

  

SGU 332 Largest Circle(凸包内接圆半径nlogn)相关推荐

  1. opencv 最大内接矩形_OpenCV之二值图像分析 – 寻找最大内接圆

    python代码: from __future__ import print_function from __future__ import division import cv2 as cv imp ...

  2. 375 Inscribed Circles and Isosceles Triangles 等腰三角形 内接圆 圆周率PI表示

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  3. UVa 375 内接圆和等腰三角形

    /* * 解题思路: * 题意不难理解.一直求内接圆半径.知道半径长度小于0.000001为止 */ #include <math.h> #include <stdio.h> ...

  4. 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...

    编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...

  5. 习题:编程求圆周长、圆面积、圆球体积、设圆半径r=1.5。要求:用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数后2位...

    1 /*编程求圆周长.圆面积.圆球体积.设圆半径r=1.5.要求:用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数后2位*/ 2 /*圆球体积公式 V=(4*π*r3)/3 */ 3 ...

  6. 输入圆半径,求圆面积并保留两位小数

    import java.util.*; //调用util包中的所有类 public class Circle //定义一个Circle类 {public static void main(String ...

  7. 百度地图画圆:动态绘制显示圆半径

    百度地图画圆:动态绘制显示圆半径 在开发百度地图时,项目需要借助画圆工具框选地图上的点,原始画圆工具可以通过 enableCalculate() 方法获取框选区域面积,进而可以计算圆的半径.      ...

  8. PTA java 异常:圆半径不能为负数

    这是函数题模板.这里写题目要求.计算圆的面积,其中PAI取3.14,圆半径为负数时应抛出异常,输出相应提示. 函数接口定义: 裁判测试程序样例: 在这里给出函数被调用进行测试的例子.例如: impor ...

  9. C语言学习之有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1

    有4个圆塔,圆心分别为(2,2).(-2,2).(-2,-2).(2,-2),圆半径为1,这4个塔的高度为10m,塔以外无建筑物.今输入任一点的坐标,求该点的建筑高度(塔外的高度为零). #inclu ...

最新文章

  1. 添加墙元素实现碰撞效果
  2. 质数,约数(数论) AcWing算法课
  3. u-boot移植第四弹——2013.10u-boot增加dm9000的支持
  4. NFS搭建openfoam
  5. 【PM】当大厂来临时,求生?求胜?
  6. 终极Java日志字典:开发人员最常记录的单词是什么?
  7. 《Python Cookbook 3rd》笔记(1.18):映射名称到序列元素
  8. file 创建 txt文件
  9. Window系统下 MongoDB 下载 和 安装
  10. 使用emacs + cscope + ecb替代source insight
  11. 计算机的管理选项文件错误,如何修复Microsoft Teams错误文件在Windows PC中被锁定...
  12. 通信原理 简易AMI码与HDB3码编码方式比较的matlab实现
  13. 【matlab】 GMSK的调制与解调【附详尽注释】
  14. 三星内存编码_想问一下三星内存条的型号有什么区别
  15. excel 置信区间 计算_正态分布 excle(Excel中用什么函数可以算置信区间,怎么算啊?)...
  16. C++多态的职工管理系统
  17. 【产业互联网周报】微盟称数据已全面找回,公布商家赔付计划;疫情影响全球展会:Facebook取消年度F8开发者大会...
  18. 视频格式转换器哪个好?怎样使用?
  19. 两个long型数据相除结果错误问题解决
  20. STM32学习记录--关于按键配置(PB3 PB4)

热门文章

  1. HDU1899 Sum the K-th's(树状数组)
  2. cactiez----监控windows主机 server 2008 r2
  3. linux 自动提权perl脚本
  4. Android常用控件之Fragment仿Android4.0设置界面
  5. Spring中加载xml配置文件的六种方式
  6. 注意:你智能机中的流氓APP
  7. Apache发布Groovy 2.5正式版及3.0预览版
  8. Eclipse 代码自动提示的设置
  9. InputStreamReader/OutputStreamWriter乱码问题解决
  10. PHP 通过fsockopen函数获取远程网页源码