// 2019.10.3

// 练习题:2018 ICPC 南京现场赛

D Country Meow

题目大意

给定空间内 N 个点,求某个点到 N 个点的距离最大值的最小值。

 

思路

非常裸的最小球覆盖问题啊,即找到半径最小的球包含全部的点。

最小圆覆盖问题上,可以使用随机增量法,这里没有四点确定球心的公式,所以板子失效了。

最小圆覆盖可以用三分套三分,这里空间有三维,假装证明得到在任意一维上都满足凸函数特性,那么再套一层维度三分就OK了。

 

AC代码

三分套三分套三分写法,复杂度O(n*log^3)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-3;
struct Point {
double x, y, z;
Point() {
x = y = z = 0.0;
}
Point(double xx, double yy, double zz) {
x = xx, y = yy, z = zz;
}
Point operator-(const Point& p) {
return Point(x-p.x, y-p.y, z-p.z);
}
double dis() {
return sqrt(x*x+y*y+z*z);
}
}pt[110];
int n; double cal(double x, double y, double z) {
double res = 0;
for(int i=1;i<=n;i++) {
res = max(res, (pt[i]-Point(x, y, z)).dis());
}
return res;
} double cal2(double x, double y) {
double res = 1e18;
double l = -100000, r = 100000;
while(r-l>eps) {
double m1 = (r-l)/3 + l;
double m2 = (r-l)/3*2 + l;
double res1 = cal(x, y, m1), res2 = cal(x, y, m2);
res = min(res, min(res1, res2));
if(res1<res2) r = m2;
else l = m1;
}
return res;
} double cal3(double x) {
double res = 1e18;
double l = -100000, r = 100000;
while(r-l>eps) {
double m1 = (r-l)/3 + l;
double m2 = (r-l)/3*2 + l;
double res1 = cal2(x, m1), res2 = cal2(x, m2);
res = min(res, min(res1, res2));
if(res1<res2) r = m2;
else l = m1;
}
return res;
} int main() {
cin>>n;
for(int i=1;i<=n;i++) {
scanf("%lf %lf %lf", &pt[i].x, &pt[i].y, &pt[i].z);
} double res = 1e18;
double l = -100000, r = 100000;
while(r-l>eps) {
double m1 = (r-l)/3 + l;
double m2 = (r-l)/3*2 + l;
double res1 = cal3(m1), res2 = cal3(m2);
res = min(res, min(res1, res2));
if(res1<res2) r = m2;
else l = m1;
}
printf("%.10lf\n", res);
return 0;
}

 

模拟退火写法,对于三维复杂度更低:

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-5;
struct Point{
double x, y, z;
}p[110], op;
int n; inline double dist(Point &a, Point &b) {
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
void solve() {
double ans, delta = 10000.0;
double maxDis, tempDis;
while(delta>eps){
int id = 0;
maxDis = dist(op, p[id]);
for(int i=1;i<n;i++){
tempDis=dist(op,p[i]);
if(tempDis>maxDis){
maxDis = tempDis;
id = i;
}
}
ans = maxDis;
op.x += (p[id].x-op.x)/maxDis*delta;
op.y += (p[id].y-op.y)/maxDis*delta;
op.z += (p[id].z-op.z)/maxDis*delta;
delta *= 0.98;
}
printf("%.10lf\n", ans);
} int main() {
while(scanf("%d", &n)!=EOF && n) {
op.x = op.y = op.z = 0;
for(int i=0;i<n;i++) {
scanf("%lf %lf %lf", &p[i].x, &p[i].y, &p[i].z);
}
solve();
}
return 0;
}

POJ2069 Super Star

这一题三分做法会T,只能用模拟退火才能过。

注意初始点选择。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps = 1e-5;
struct Point{
double x, y, z;
}p[35], op;
int n; inline double dist(Point &a, Point &b) {
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
void solve() {
double ans, delta = 100.0;
double maxDis, tempDis;
while(delta>eps){
int id = 0;
maxDis = dist(op, p[id]);
for(int i=1;i<n;i++){
tempDis=dist(op,p[i]);
if(tempDis>maxDis){
maxDis = tempDis;
id = i;
}
}
ans = maxDis;
op.x += (p[id].x-op.x)/maxDis*delta;
op.y += (p[id].y-op.y)/maxDis*delta;
op.z += (p[id].z-op.z)/maxDis*delta;
delta *= 0.98;
}
printf("%.5lf\n", ans);
} int main() {
while(scanf("%d", &n)!=EOF && n) {
op.x = op.y = op.z = 0;
for(int i=0;i<n;i++) {
scanf("%lf %lf %lf", &p[i].x, &p[i].y, &p[i].z);
op.x += p[i].x;
op.y += p[i].y;
op.z += p[i].z;
}
op.x /= n; op.y /= n; op.z /= n;
solve();
}
return 0;
}

HDU3007 HDU3932 类似。

注意HDU3932 n==1采用模拟退火要特判。。。。

D.Country Meow 最小球覆盖 三分套三分套三分 && 模拟退火的更多相关文章

  1. Gym - 101981D The 2018 ICPC Asia Nanjing Regional Contest D.Country Meow 最小球覆盖

    题面 题意:给你100个三维空间里的点,让你求一个点,使得他到所有点距离最大的值最小,也就是让你找一个最小的球覆盖掉这n个点 题解:红书模板题,这题也因为数据小,精度也不高,所以也可以用随机算法,模拟 ...

  2. 最小球覆盖——模拟退火&&三分套三分套三分

    题目 给出 $N(1 \leq N \leq 100)$ 个点的坐标 $x_i,y_i,z_i$($-100000 \leq x_i,y_i,z_i \leq 100000$),求包围全部点的最小的球 ...

  3. Gym101981D - 2018ACM-ICPC南京现场赛D题 Country Meow

    2018ACM-ICPC南京现场赛D题-Country Meow Problem D. Country Meow Input file: standard input Output file: sta ...

  4. 2018ICPC南京D. Country Meow

    题目: 题意:三维里有n个点,找一个最小的球将所有点覆盖. 题解:退火法模拟的一道板子题. 1 #include <stdio.h> 2 #include <iostream> ...

  5. Super Star(最小球覆盖)

    Super Star http://poj.org/problem?id=2069 Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  6. Country Meow

    Country Meow 和这基本一样 https://www.cnblogs.com/Fighting-sh/p/9809518.html #include<iostream> #inc ...

  7. POJ 最小球覆盖 模拟退火

    最小球覆盖:用半径最小的球去覆盖所有点. 纯粹的退火算法,是搞不定的,精度不够,不然就会TLE,根本跑不出答案来. 任取一点为球心,然后一点点靠近最远点.其实这才是最主要的. 因为:4个点确定一个球, ...

  8. Gym - 101981D Country Meow(模拟退火)

    题意 三维空间有\(n\)个点,找到另外一个点,离所有点的最大距离最小.求这个距离. 题解 \(1\).最小球覆盖,要找的点为球心. \(2\).模拟退火. 还是补一下模拟退火的介绍吧. 模拟退火有一 ...

  9. POJ2069 最小球覆盖 几何法和退火法

    对这种问题不熟悉的读者 可以先去看一看最小圆覆盖的问题 ZOJ1450 现在我们来看最小球覆盖问题POJ2069 题目很裸,给30个点 求能覆盖所有点的最小球的半径. 先给出以下几个事实: 1.对于一 ...

随机推荐

  1. 【Dart学习】-- Dart之匿名方法 & 回调函数 & 闭包

    一,匿名方法定义 (参数1,参数2,....){ 方法体... return 返回值 } 二,匿名方法特性 可赋值给变量,通过变量进行调用 可在其他方法中直接调用或传递给其他方法 void main( ...

  2. h5移动端局部放大效果

    首先添加zoom.js (function (root, factory) { if (typeof exports === 'object' && typeof module === ...

  3. Delphi 文件操作(路径、目录)

    Delphi利用系统环境变量获取常用系统目录 //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var s: string; begin s := GetEnvironmentV ...

  4. react react使用css

    在react 中使用css有以下几种方法 第一种全局使用 app.js import React from 'react'; import Router from "./router&quo ...

  5. solidity代码

    http://www.tryblockchain.org/ 教你如何舒服的看solidity代码 最近智能合约随着区块链技术的发展越发收到广大技术人员的重视! 其中最被看好的以太坊就是一个提供智能合约 ...

  6. 11、jQueryEasyUI的基本组件

    1.拖动的div <!--jquery 的主文件...--> <script type="text/javascript" src="../../js/ ...

  7. 使用FTPClient实现文件上传服务器

    import ch.qos.logback.classic.Logger; import org.apache.commons.net.ftp.*; import org.slf4j.LoggerFa ...

  8. hibernate基本配置优化

    前面已经说过hibernate的基本配置了,现在对之前的基本配置进行代码优化: 写一个读取配置工具 package tool; import org.hibernate.Session; import ...

  9. 第48章 MDK的编译过程及文件类型全解

    Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...

  10. PAT_A1084#Broken Keyboard

    Source: PAT A1084 Broken Keyboard (20 分) Description: On a broken keyboard, some of the keys are wor ...