原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1412

  题目要求判断是否有一条直线可以穿过所有的圆。

  做法:把所有圆心做一次凸包,然后判断这个凸包是否能通过一个宽度为2*R的通道。

  做法和求凸包直径差不多,只是判断的时候把点到两个端点的距离换成点到直线的距离。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
using namespace std; #define inf 1e20
#define eps 1e-8 const int N = ;
const double PI = 2.0*asin(1.0); //高精度求PI
struct Lpoint
{
double x,y;
}a[N], b[N]; //点
struct Llineseg
{
Lpoint a,b;
}; //线段
struct Ldir
{
double dx,dy;
}; //方向向量
struct Lline
{
Lpoint p;
Ldir dir;
}; //直线 bool mult(Lpoint sp, Lpoint ep, Lpoint op)
{
return (sp.x - op.x) * (ep.y - op.y)
>= (ep.x - op.x) * (sp.y - op.y);
} bool operator < (const Lpoint &l, const Lpoint &r)
{
return l.y < r.y || (l.y == r.y && l.x < r.x);
} int graham(Lpoint pnt[], int n, Lpoint res[])
{
int i, len, top = ;
sort(pnt, pnt + n);
if (n == ) return ;
res[] = pnt[];
if (n == ) return ;
res[] = pnt[];
if (n == ) return ;
res[] = pnt[];
for (i = ; i < n; i++)
{
while (top && mult(pnt[i], res[top], res[top-]))
top--;
res[++top] = pnt[i];
}
len = top;
res[++top] = pnt[n - ];
for (i = n - ; i >= ; i--)
{
while (top!=len && mult(pnt[i], res[top], res[top-])) top--;
res[++top] = pnt[i];
}
return top; // 返回凸包中点的个数
} void format(Lline ln, double& A, double& B, double& C)
{
A=ln.dir.dy;
B=-ln.dir.dx;
C=ln.p.y*ln.dir.dx-ln.p.x*ln.dir.dy; } double p2ldis(Lpoint a, Lline ln)
{
double A,B,C;
format(ln,A,B,C);
return(fabs(A*a.x+B*a.y+C)/sqrt(A*A+B*B));
} double CPMD(Lpoint p[], int n)//ConvexPolygonMinimumDiameter
{
int i, j;
double ans = inf, tmp;
p[n] = p[];
Lline ln;
Ldir dir;
for(i = , j = ; i < n; ++i)
{
if((i+)%n == j) j = (j + ) % n;
dir.dx = p[i].x - p[i+].x;
dir.dy = p[i].y - p[i+].y;
ln.dir = dir;
ln.p = p[i];
while((tmp = p2ldis(p[j], ln)) < (p2ldis(p[(j+)%n], ln)))
j = (j + ) % n;
ans = min(ans, tmp);
}
return ans;
} double dis(Lpoint u, Lpoint v)
{
return sqrt((u.x-v.x) * (u.x-v.x) + (u.y - v.y)*(u.y - v.y));
} int main()
{
int n, t;
double r;
scanf("%d", &t);
while(t--)
{
scanf("%d%lf", &n, &r);
for(int i = ; i < n; i++)
scanf("%lf%lf", &a[i].x, &a[i].y);
int m = graham(a, n, b);
if(m <= )
{
printf("Yes\n");
continue;
}
double k = CPMD(b, m);
if(k - *r < eps)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

CSU 1412 Line and Circles的更多相关文章

  1. matplotlib 柱状图、饼图;直方图、盒图

    #-*- coding: utf-8 -*- import matplotlib.pyplot as plt import numpy as np import matplotlib as mpl m ...

  2. Python图表绘制:matplotlib绘图库入门

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  3. 对于fmri的设计矩阵构造的一个很直观的解释-by 西南大学xulei教授

    本程序意在解释这样几个问题:完整版代码在本文的最后. 1.实验的设计如何转换成设计矩阵? 2.设计矩阵的每列表示一个刺激条件,如何确定它们? 3.如何根据设计矩阵和每个体素的信号求得该体素对刺激的敏感 ...

  4. Python图表绘制:matplotlib绘图库入门(转)

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  5. Python绘图matplotlib

    转自http://blog.csdn.net/ywjun0919/article/details/8692018 Python图表绘制:matplotlib绘图库入门 matplotlib 是pyth ...

  6. pandas 读写sql数据库

    如何从数据库中读取数据到DataFrame中? 使用pandas.io.sql模块中的sql.read_sql_query(sql_str,conn)和sql.read_sql_table(table ...

  7. matplotlib画图实例:pyplot、pylab模块及作图參数

    http://blog.csdn.net/pipisorry/article/details/40005163 Matplotlib.pyplot画图实例 {使用pyplot模块} matplotli ...

  8. 【Python开发】使用python中的matplotlib进行绘图分析数据

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...

  9. csu 1812: 三角形和矩形 凸包

    传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************** ...

随机推荐

  1. word----遇到问题-----word中插入的图片无法左对齐----格式按钮为灰色

    当我们在用word时,有时要插入图片,却发现,插入的图片只在中间位置,不能拖到左边,这时怎么办呢 主要是图层的高低原因导致的不能拖动. 这个时候我们只需要设置一下图片的图层类型即可. 对着图片右键在设 ...

  2. Hibernate持久化对象修改id重新保存的办法

    Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二 2017年11月10日 20:16:48 筱光 阅读数:1122   版权声明:本文为博主原创文章,未经博主允许不得 ...

  3. SpringBoot(三) :Spring boot 中 Redis 的使用

    前言: 这一篇讲的是Spring Boot中Redis的运用,之前没有在项目中用过Redis,所以没有太大的感觉,以后可能需要回头再来仔细看看. 原文出处: 纯洁的微笑 SpringBoot对常用的数 ...

  4. ubuntu登陆界面损坏修复

    Ubuntu系统从14升16过程中,不小心进入休眠状态.之后Ubuntu桌面界面打不开.进入命令模式,手动修复 网上的答案是这样: 首先,测试桌面环境安装是否完全.sudo apt-get insta ...

  5. docker操作mysql

    Docker操作mysql 查找docker hub上的mysql镜像 Docker search.mysql 拉取官方的镜像标签为5.6 Docker pull mysql:5.6 在本地镜像列表里 ...

  6. ssl证书生成方法

    一般情况下,如果能找到可用的证书,就可以直接使用,只不过会因证书的某些信息不正确或与部署证书的主机不匹配而导致浏览器提示证书无效,但这并不影响使用. 需要手工生成证书的情况有: 找不到可用的证书 需要 ...

  7. [LeetCode] 31. Next Permutation ☆☆☆

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  8. HDU 2239 polya计数 欧拉函数

    这题模数是9937还不是素数,求逆元还得手动求. 项链翻转一样的算一种相当于就是一种类型的置换,那么在n长度内,对于每个i其循环节数为(i,n),但是由于n<=2^32,肯定不能直接枚举,所有考 ...

  9. Linux高级编程--04.GDB调试程序(入门概述)

    GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试 ...

  10. 三星c7换屏幕教程

    https://jingyan.baidu.com/article/20b68a88f49cb9796cec6282.html