这个题正解是最小生成树,但是。。。最大值最小?一看就是二分答案啊!不用多想,直接二分答案加暴力验证就行了。

题干:

Description

聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗。只是,这一切都成为谜团了——聪聪根本就不知道部落究竟是如何分布的。 不过好消息是,聪聪得到了一份荒岛的地图。地图上标注了N个野人居住的地点(可以看作是平面上的坐标)。我们知道,同一个部落的野人总是生活在附近。我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离。聪聪还获得了一个有意义的信息——这些野人总共被分为了K个部落!这真是个好消息。聪聪希望从这些信息里挖掘出所有部落的详细信息。他正在尝试这样一种算法: 对于任意一种部落划分的方法,都能够求出两个部落之间的距离,聪聪希望求出一种部落划分的方法,使靠得最近的两个部落尽可能远离。 例如,下面的左图表示了一个好的划分,而右图则不是。请你编程帮助聪聪解决这个难题。 

Input

第一行包含两个整数N和K(< = N < = ,< K < = N),分别代表了野人居住点的数量和部落的数量。
接下来N行,每行包含两个正整数x,y,描述了一个居住点的坐标( < =x, y < =)
Output
输出一行,为最优划分时,最近的两个部落的距离,精确到小数点后两位。
Sample Input Sample Output
1.00

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const db eps = 1e-;
db x[],y[];
int fa[],n,m;
int get_fa(int x)
{
if(fa[x] != x)
return fa[x] = get_fa(fa[x]);
else
return x;
}
void un(int x,int y)
{
x = get_fa(x);
y = get_fa(y);
if(x != y)
fa[x] = y;
}
bool check(db mid)
{
duke(i,,n)
{
fa[i] = i;
}
duke(i,,n)
{
duke(j,,n)
{
if((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) < mid)
{
un(i,j);
}
}
}
int tot = ;
duke(i,,n)
{
if(fa[i] == i)
tot++;
}
if(tot < m)
return false;
else
return true;
}
int main()
{
db mx = ,my = ;
read(n);read(m);
duke(i,,n)
{
read(x[i]);
read(y[i]);
mx = max(x[i],mx);
my = max(y[i],my);
}
db l = ,r = mx * mx + my * my;
while(r - l > eps)
{
db mid = (l + r) / ;
if(check(mid))
l = mid;
else
r = mid;
}
printf("%.2lf",sqrt(l));
}

最新文章

  1. Android内容观察者
  2. C 语言学习的第 01 课:先来聊聊计算机吧
  3. 在线学习体验大PK 云智慧发布在线教育网站性能监测报告
  4. Opencv--HoughCircles源码剖析
  5. Spring 整合hibernante 错误java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  6. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)
  7. Qt on Android: Qt 5.3.0 公布,针对 Android 改进的说明
  8. Python数据分析-知识宝藏
  9. Linux 查看负载内存
  10. Redis的启动及配置
  11. Java 基础 常用API (Object类,String类,StringBuffer类)
  12. 串口转以太客户端(增加uci、可连接多个服务器)
  13. 非常可乐(杭电hdu1495)bfs
  14. Oozie workflow工作流action间参数传递实现
  15. Vue的实时时间转换Demo
  16. Windows 10安装MongoDB(安装&amp;启动)
  17. hdu 4961 Boring Sum(高效)
  18. linux profile\bashrc\bash_profile之间的区别和联系
  19. Java虚拟机的内存管理----垃圾收集器
  20. 【黑金原创教程】【Modelsim】【第三章】理想就是美丽

热门文章

  1. 14、Scala类型参数
  2. C#斐波那契数列方法
  3. 文章或者观点说说等点赞功能实现(thinkphp)
  4. Python 内置函数 day4
  5. vue移动端地址三级联动组件(二)
  6. forcedirectories和CreateDirectory
  7. MySQL5.7本地首次登录win10报错修改
  8. Linux常用shell命令持续总结
  9. System----堡垒机
  10. javascript 闭包笔记