当前位置: 首页 > news >正文

POJ 1981 Circle and Points (扫描线)


【题目链接】 http://poj.org/problem?id=1981

 

【题目大意】

  给出平面上一些点,问一个半径为1的圆最多可以覆盖几个点

 

【题解】

  我们对于每个点画半径为1的圆,那么在两圆交弧上的点所画的圆,一定可以覆盖这两个点
  我们对于每个点计算出其和其它点的交弧,对这些交弧计算起末位置对于圆心的极角,
  对这些我们进行扫描线操作,统计最大交集数量就是答案。

 

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath> 
#include <cstring>
using namespace std;
double EPS=1e-10;
double add(double a,double b){
    if(abs(a+b)<EPS*(abs(a)+abs(b)))return 0;
    return a+b;
}
const int MAX_N=310;
struct P{
    double x,y;
    P(){}
    P(double x,double y):x(x),y(y){}
    P operator + (P p){return P(add(x,p.x),add(y,p.y));}
    P operator - (P p){return P(add(x,-p.x),add(y,-p.y));}
    P operator * (double d){return P(x*d,y*d);}
    double dot(P p){return add(x*p.x,y*p.y);} //点积
    double det(P p){return add(x*p.y,-y*p.x);}  //叉积
}ps[MAX_N];
double dist(P p,P q){return sqrt((p-q).dot(p-q));}
struct PolarAngle{
    double angle;
    bool flag;
}as[MAX_N];
bool cmp_a(PolarAngle a,PolarAngle b){
	return a.angle<b.angle;
}
int solve(int n,double r){
    int ans=1;
    for(int i=0;i<n;i++){
        int m=0; double d;
        for(int j=0;j<n;j++){
            if(i!=j&&(d=dist(ps[i],ps[j]))<=2*r){
                double phi=acos(d/2);
                double theta=atan2(ps[j].y-ps[i].y,ps[j].x-ps[i].x);
                as[m].angle=theta-phi,as[m++].flag=1;
                as[m].angle=theta+phi,as[m++].flag=0;
            }
        }sort(as,as+m,cmp_a);
        for(int sum=1,j=0;j<m;j++){
            if(as[j].flag)sum++;
            else sum--;
            ans=max(ans,sum);
        }
    }return ans;
}
int N;
int main(){
    while(scanf("%d",&N),N){
        for(int i=0;i<N;i++)scanf("%lf%lf",&ps[i].x,&ps[i].y);
        printf("%d\n",solve(N,1.0));
    }return 0;
}

转载于:https://www.cnblogs.com/forever97/p/poj1981.html

相关文章:

  • flex 自定义事件
  • spss-数据抽取-拆分与合并
  • flex metadata tag学习
  • 201521123108 《Java程序设计》第2周学习总结
  • flex子组件关闭父组件
  • Eclipse安装svn插件问题解决
  • 利用chmod获取权限
  • tomcat一闪而过解决方法
  • APP加固
  • jforum开源论坛安装
  • Vue.js之组件(component)
  • jforum架构和主要配置文件的说明
  • Axure--一个很好的原型设计软件
  • flex程序初始化顺序
  • [C/C++] C/C++中数字与字符串之间的转换
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • JavaScript 基础知识 - 入门篇(一)
  • javascript数组去重/查找/插入/删除
  • JS变量作用域
  • linux安装openssl、swoole等扩展的具体步骤
  • PHP的类修饰符与访问修饰符
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 浮现式设计
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于Java中分层中遇到的一些问题
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用权重正则化较少模型过拟合
  • 小程序开发中的那些坑
  • ​Linux·i2c驱动架构​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (06)金属布线——为半导体注入生命的连接
  • (4)STL算法之比较
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (离散数学)逻辑连接词
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (五)Python 垃圾回收机制
  • (原)本想说脏话,奈何已放下
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ./configure,make,make install的作用
  • ./和../以及/和~之间的区别
  • .naturalWidth 和naturalHeight属性,
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 中的路径问题
  • .net MVC中使用angularJs刷新页面数据列表
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • ::前边啥也没有
  • :O)修改linux硬件时间
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会