博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 1106 Transmitters
阅读量:6002 次
发布时间:2019-06-20

本文共 1279 字,大约阅读时间需要 4 分钟。

题意:给定一个点的坐标和一个圆半径,一个整数n,然后n个点坐标,求以给定点所在半圆能包含的最多点的个数;

思路:枚举半圆直径边界,统计该边界一侧的包含点数,更新最大值;

技巧:使用叉积,能方便的判断两向量的夹角是否小于180度;

#include
#include
#include
#include
using namespace std;const double epsi=1e-10;const double pi=acos(-1.0);const int maxn=50005;struct point{ double x,y; point(double xx=0,double yy=0):x(xx),y(yy){} point operator -(const point &op2) const{ //向量相减 return point(x-op2.x,y-op2.y); } double operator ^(const point &op2) const{ //两个点向量的叉积 return x*op2.y-y*op2.x; }};inline int sign(const double &x){ //判断浮点数正负 if(x>epsi) return 1; if(x<-epsi) return -1; return 0;}inline double sqr(const double &x){ //平方 return x*x;}inline double mul(const point &p0,const point &p1,const point &p2){ //p0p1与p0p2的叉积 return (p1-p0)^(p2-p0);}inline double dis2(const point &p0,const point &p1){ //p0p1向量模的平方 return sqr(p0.x-p1.x)+sqr(p0.y-p1.y);}inline double dis(const point &p0,const point &p1){ //p0p1的向量模 return sqrt(dis2(p0,p1));}int n;point p[maxn],cp;double r;int main(){ while(scanf("%lf%lf%lf",&cp.x,&cp.y,&r)&&r>=0){ scanf("%d",&n); int ans=0; for(int i=0;i

 

转载于:https://www.cnblogs.com/dashuzhilin/p/4539478.html

你可能感兴趣的文章
The secret code
查看>>
Makefile 多目录自动编译
查看>>
学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中
查看>>
统一Matlab下不同子图的色标colorbar
查看>>
Linux 进程间通信(二) 管道
查看>>
Ajax保留浏览器历史的两种解决方案(Hash&Pjax)
查看>>
深入浅出JQuery (二) 选择器
查看>>
CI框架 -- 驱动器
查看>>
FastMQ V0.2.0 stable版发布
查看>>
对象复制
查看>>
Mongodb内嵌数组的完全匹配查询
查看>>
MyBatis学习笔记(四) 注解
查看>>
什么是数据仓库主题
查看>>
WARN hdfs.DFSClient: Caught exception java.lang.InterruptedException
查看>>
移动硬盘文件或目录损坏且无法读取怎么解决
查看>>
在shell中使用sed命令替换/为\/
查看>>
JavaSe: 不要小看了 Serializable
查看>>
Node.js 抓取电影天堂新上电影节目单及ftp链接
查看>>
js课程 3-9 js内置对象定时器和超时器怎么使用
查看>>
linux popen函数
查看>>