Bamboo之吃我一拳

分析

当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0

寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均不符合条件。

在一堆点中找到两个点的距离最小,暴力的O(n^2)计算量很恐怖,可以用分治思想把问题变小:

把平面上的点分为两拨,距离最近的两个点只可能出现在:第一堆,第二堆,和两堆2中各自一个点

分解

想象一条垂直线把所给点集分成两拨:所有的点要么在直线左边,要么在其右边。按x坐标升序排列。

解决

划分后两次递归调用,一次找到左边中的最近点对,一次找右边中的最近点对。取d'为两者中的最小值

合并

最近点对的距离d要么是某次递归找到的d',要么是左边右边各取一个点组成的点对。就要查找是否存在距离小于d'且一个在左一个在右的点对。如果这两个点的距离<d',那么两个点其实都各自在距离垂直线d'的距离之内。也就是以垂直线为轴线,宽度为2*d'的范围内,将这个范围内的点取出,并按照Y升序排列,只需要遍历任一点与范围内周围7个点的距离就可以了,比较选择更小值。

代码

#include <iostream>
#include <algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<iomanip>
using namespace std; const int maxx = 1e5 + 3;
int num[maxx];
struct point{
int x, y;
}p[maxx];
bool cmpx(const point&a, const point& b)//按x坐标排序
{
return a.x<b.x;
}
bool cmpy(const int& a, const int &b)//按y坐标排序
{
return p[a].y<p[b].y;
}
double dis(point a, point b)//计算两点距离
{
return ((double)(a.x - b.x)*(a.x - b.x) + (double)(a.y - b.y)*(a.y - b.y));
}
double closest(int low, int high)//求最近距离
{
if (low + 1 == high)//两个点情况,已经递归到底
return dis(p[low], p[high]);
if (low + 2 == high)//三个点
return min(dis(p[low], p[high]), min(dis(p[low], p[low + 1]), dis(p[low + 1], p[high])));
int mid = (low + high) / 2;
double ans = min(closest(low, mid), closest(mid + 1, high));//两组分别递归,去最下者 int i, j, cnt = 0;
for (i = low; i <= high; i++)
{
if (p[i].x >= p[mid].x - ans && p[i].x <= p[mid].x + ans)
num[cnt++] = i;
}
sort(num, num + cnt, cmpy);//这是在直线两侧ans距离内的点按y坐标排序
for (i = 0; i < cnt; i++) {
int k = i + 7 > cnt ? cnt : i + 7;
for (j = i + 1; j < k; j++) {
if (p[num[j]].y - p[num[i]].y > ans)
break;
ans = min(dis(p[num[i]], p[num[j]]), ans);
}
}
return ans;
}
int main()
{
int n;
while (~scanf("%d", &n))
{
for (int i = 0; i<n; i++)
scanf("%d %d", &p[i].x, &p[i].y);
sort(p, p + n, cmpx);
double ans = closest(0, n - 1);
ans = sqrt(ans);
printf("%.2lf\n", ans);
}
}
另外

严格的说本题的数据是要卡掉O(n^2)暴力算法的,但你们的grh大佬借助sin 和cos计算距离,运算时间甚至比O(nlogn)的分治法还要快,,,

2016级算法第六次上机-E.Bamboo之吃我一拳的更多相关文章

  1. 2016级算法第六次上机-A.Bamboo之寻找小金刚

    Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...

  2. 2016级算法第六次上机-F.AlvinZH的学霸养成记VI

    1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...

  3. 2016级算法第六次上机-G.ModricWang likes geometry

    1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码

  4. 2016级算法第六次上机-D.AlvinZH的学霸养成记V

    1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...

  5. 2016级算法第六次上机-C.AlvinZH的学霸养成记II

    1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时cu ...

  6. 2016级算法第六次上机-B.ModricWang's FFT : EASY VERSION

    1114 ModricWang's FFT EASY VERSION 思路 利用FFT做大整数乘法,实际上是把大整数变成多项式,然后做多项式乘法. 例如,对于\(1234\),改写成\(f(x)=1* ...

  7. 2016级算法第五次上机-C.Bamboo和"Coco"

    1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...

  8. 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水

    Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...

  9. 2016级算法第四次上机-E.Bamboo and the Ancient Spell

    Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...

随机推荐

  1. Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践)

     转载:http://www.cnblogs.com/EasonJim/p/6295372.html Jenkins使用FTP进行一键部署及回滚2(Windows)(项目实践) 前提: 这一篇是继上一 ...

  2. TLB与内存寻址,内存读取,虚拟内存的相关原理

    TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存. TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个 ...

  3. CiteSpace安装使用简介

    一.简介 CiteSpaceⅡ基于JAVA平台的信息可视化软,是美国Drexel大学陈超美(Chaomei Chen)教授开发的,用于文献引文网络分析的信息,作为文献计量学方面最先进的分析工具之一,是 ...

  4. linux下PHP7安装memcache

    1.memcache服务器的安装 .分别把memcached和libevent下载回来,放到 /tmp 目录下: # cd /tmp # wget http://www.danga.com/memca ...

  5. 查找yum 安装目录

    [root@DB-Server ~]# rpm -qa | grep -i mysql MySQL-server-advanced-5.6.20-1.rhel5 MySQL-client-advanc ...

  6. 自动化ui 保存max场景信息 结构化处理比较好用

    struct gt_cl_hp_saveMaxinfo ( pathpp ="" , fn savemaxinfor =( DialogMonitorOPS.unRegisterN ...

  7. SpringBoot2.0WebFlux响应式编程知识总结

  8. WPF 绑定备忘单

     Part I – Common Examples Basic Binding   {Binding}  Bind to current DataContext. {Binding Name}  Bi ...

  9. Task的运行原理和工作窃取(work stealing)

    在net4.0以前,当调用ThreadPool.QueueUserWorkItem方法往线程池中插入作业时,会把作业内容(其实就是一个委托)放到线程池中的一个全局队列中,然后线程池中的线程按照先进先出 ...

  10. Centos 下部署tomcat多实例

    基础环境及JDK就不多说了,下面的目录结构以如下为准: 根目录-apps 根目录-apps--tomcat 根目录-apps--ins1 根目录-apps--ins2 ================ ...