单位圆的最多覆盖据点 (重点需要学习!)

我自己的代码,提交错误,需要修改

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <iostream>
#include <string>
#include <algorithm>
#define eps 1e-8

using namespace std;

struct point
{
	double x;
	double y;
	int w;
	point(){}
	point (double tx, double ty)
	{
	    x=tx; y=ty;
	}
}a[300+10];

double Dist(point a, point b )
{
	return sqrt( (b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y) );
}

point find_start(point p1, point p2)
{
/*	point p, mid, start;
	double d, aa;
	p.x=p2.x-p1.x;
	p.y=p2.y-p1.y;

	mid.x = (p1.x +p2.x)/2;
	mid.y = (p1.y +p2.y)/2;

	d = sqrt( 1-Dist(p1, mid) );//公共弦长的一半长

	if( fabs(p.y) < eps )
	{
		start.x = mid.x;
		start.y = mid.y + d;
	}
	else
	{
		aa = atan(-p.x/p.y);
		start.x = mid.x + d*cos(aa);
		start.y = mid.y + d*sin(aa);
	}
	return start; */
	point mid=point((p1.x+p2.x)/2,(p1.y+p2.y)/2);

    double angle=atan2(p1.x-p2.x,p2.y-p1.y);

    double d=sqrt(1-Dist(p1,mid)*Dist(p1,mid));

    return point(mid.x+d*cos(angle), mid.y+d*sin(angle));
}

int main()
{
    int n;
    int i, j, k;

	int ans, ans0;
	point centre;
	double tmp;

  	while(scanf("%d", &n)!=EOF)
	{
		if(n==0) break;
		for(i=0; i<n; i++)
		{
			scanf("%lf %lf %d", &a[i].x, &a[i].y, &a[i].w );
		}
		ans=0; //结果至少为1
		for(i=0; i<n; i++)
		{
			for(j=i+1; j<n; j++)
			{
				if( Dist(a[i], a[j]) > 2.0 )
					continue;
				ans0=0; //
				centre = find_start(a[i], a[j]);

				for(k=0; k<n; k++)
				{
					tmp = Dist(centre, a[k]);
					if(tmp<1.00000001)
						ans0+=a[k].w;
				}
				ans=max(ans, ans0);
			}
		}
		printf("%d\n", ans );
	}
	return 0;
}

上述方法理论上的处理数据量不大

还有另外一种方法:可以参考如下博客

http://blog.csdn.net/acm_cxlove/article/details/7894310

hihocoder #1064 解题博客:地址:http://blog.csdn.net/u014076176/article/details/39825957

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define ll long long
#define db double
#define PB push_back
#define lson k<<1
#define rson k<<1|1
using namespace std;

const int N = 2005;
const db PI = acos(-1.0);
const db eps = 1e-8;

int sgn(db t)
{
    return t<-eps?-1:t>eps;
}

struct Point
{
    db x,y;
    int w;
    Point (db _x=0,db _y=0):x(_x),y(_y) {}
    void input()
    {
        scanf("%lf%lf%d",&x,&y,&w);
    }
    db len2()
    {
        return x*x+y*y;
    }
    db len()
    {
        return sqrt(len2());
    }
    Point operator - (const Point &t) const
    {
        return Point(x-t.x,y-t.y);
    }
    bool operator == (const Point &t) const
    {
        return sgn(x-t.x)==0&&sgn(y-t.y)==0;
    }
    db operator * (const Point &t) const
    {
        return x*t.y-t.x*y;
    }
} p[N];

struct node
{
    db thta;
    int w;
    bool operator < (const node &t) const
    {
        if(thta==t.thta) return w>t.w;
        return thta<t.thta;
    }
} jd[N*4];

int ln;
void add(db thta,int w)
{
    jd[ln].thta=thta,jd[ln++].w=w;
    jd[ln].thta=thta+PI*2,jd[ln++].w=w;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++) p[i].input();
    Point px;
    int ans=0;
    for(int i=0; i<n; i++)
    {
        px=Point(p[i].x+1.0,p[i].y);
        ln=0;
        int nw=p[i].w;
        for(int j=0; j<n; j++)
        {
            if(i!=j)
            {
                db d=(p[i]-p[j]).len();
                if(d>2.0) continue;
                db thta=atan2((p[j]-p[i]).y,(p[j]-p[i]).x);
                db th=acos(d/2.0);
                add(thta-th,p[j].w),add(thta+th,-p[j].w);
            }
        }
        sort(jd,jd+ln);
        int mm=nw;
        for(int j=0; j<ln; j++)
            nw+=jd[j].w,mm=max(mm,nw);
        ans=max(ans,mm);
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-08-24 16:02:53

单位圆的最多覆盖据点 (重点需要学习!)的相关文章

hduoj 1077 Catching Fish 求单位圆最多覆盖点个数

Catching Fish Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1217    Accepted Submission(s): 466 Problem Description Ignatius likes catching fish very much. He has a fishnet whose shape is a c

poj 3384 Feng Shui 半平面交的应用 求最多覆盖凸多边形的面积的两个圆 的圆心坐标

题目来源: http://poj.org/problem?id=3384 分析: 用半平面交将多边形的每条边一起向"内"推进R,得到新的多边形(半平面交),然后求多边形的最远两点. 代码如下: const double EPS = 1e-10; const int Max_N = 105 ; struct Point{ double x,y; Point(){} Point(double x, double y):x(x),y(y){} Point operator - (Point

Github上Stars最多的53个深度学习项目,TensorFlow遥遥领先

原文:https://github.com/aymericdamien/TopDeepLearning 项目名称 Stars 项目介绍 TensorFlow 29622 使用数据流图计算可扩展机器学习问题. Caffe 11799 Caffe是一个高效的开源深度学习框架. Neural Style 10148 Torch实现的神经网络算法. Deep Dream 9042 Deep Dream,一款图像识别工具. Keras 7502 一款Python实现的深度学习库,包括卷积神经网络.递归神经

百度上--计算机专业课的学习

我 是一个大的门类,主要看你想学哪个专业方向.如果想学广告设计方面,可以从平面设计photoshop开始学:如果想学网络技术方面,可以选择一些网页编辑.动画方面的书缉:如果想学程序设计方面可以选JAVA等方面书--学习计算机读哪些书有什么用 1,高等数学:为了及格,同时帮助概率及格 2,概率:为了证明高等数学可以帮助及格 3,线性代数:如果你学习计算机图形学,就是opengl/direct3d的话,里面的3d模型的空间坐标用矩阵来表示的,如果你需要把它们进行投影,叠加,移动,就需要矩阵乘法/变换

Android之ListView——ArrayAdapter的学习与总结

问题:当ListView选定的ListItem视图中存在一些UI组件,如CheckBox,出于对状态保存的期望,发现当勾选后将列表往下滑再滑回去时,意外地发现状态没有保存 解决过程: 1)思考后想到这个原因是因为重用了convertView,当重用converView时,原先勾选的状态没有保存,又被新的数据源覆盖,重点代码为: if (convertView == null) { convertView = getLayoutInflater().inflate( R.layout.city_l

java学习笔记3

高手Java核心技术学习笔记 掌握Java核心技术是学习和掌握好Java技术的关键,下边分17个点对这些Java核心技术进行讲解. 1.Java中没有多继承,而是用接口来代替多继承 2.运行一个已经编译的程序时,Java解释器总是从指定类的main方法中的代码开始执行,因此,执行代码中必须有一个main函数. 3.Java是典型的强类型语言,即必须声明变量的类型,Java中有8种类型,6种数值类型(4个整数型和2个浮点型).一个字符类型和一个boolean类型. 4.强制类型转换:int nx

如何以学习单片机为契机,逐步成为优秀的工程师

现状 不知道阅读本文的读者,在初学单片机时是否和我曾经一样迷茫.看到各种新的术语,疑惑不解:不知道从何学起:照着书中的例子一步一步做都没有问题,但是自己试着做东西,遇到各种问题却不会解决,向别人提问,可能也没有几个人回答:感觉好像学完了单片机的各种模块,但是要自己设计东西却还是毫无思路,也不知道怎么去进一步深入学习:甚至在一开始就遇到太多困难,直接放弃了学习. 在我身边,看到不少学习单片机的人.其中很多人学习的方法,就是通过看一些视频或书籍教程,然后照着别人的代码去写,写好了能用了,就感觉是学会

第二十五篇 jQuery 学习7 获取并设置 CSS 类

jQuery 学习7 获取并设置 CSS 类 jQuery动态控制页面,那么什么是动态呢?我们就说一下静态,静态几乎又纯html+css完成,就是刷新页面之后,不会再出现什么变动,一个实打实的静态页面.那么动态,我们基于静态的特征说,动态:刷新页面之后,还可以发生样式改变等,就为动态. 这节课我们学习的是jQuery控制css,那么css样式都被改变了,算动态么?当然算啦,刷新页面之后发生了改变,就已经不是静态了,只要是变动了,就算是啦. 我们这节课学习四个控制css的方法: addClass(

怎样以学习单片机为契机,逐步成为优秀的project师

现状 不知道阅读本文的读者,在初学单片机时是否和我以前一样迷茫.看到各种新的术语,疑惑不解:不知道从何学起:照着书中的样例一步一步做都没有问题,可是自己试着做东西,遇到各种问题却不会解决,向别人提问,可能也没有几个人回答:感觉好像学完了单片机的各种模块,可是要自己设计东西却还是毫无思路,也不知道怎么去进一步深入学习:甚至在一開始就遇到太多困难,直接放弃了学习. 在我身边,看到不少学习单片机的人.当中非常多人学习的方法,就是通过看一些视频或书籍教程,然后照着别人的代码去写,写好了能用了,就感觉是学