题意
在坐标轴上给出n
条线段,圆心在x
轴的[0,L]
上移动,在该圆不和任何线段相交的情况下最大的半径是多少?
题解
模拟退火,因为模拟退火可以并行执行,所以先随机出多个点的位置(多组可能解),然后对这些解进行模拟退火,得出点到线段的最短距离用的是失量法。
点与线段一共会有下列两种位置。
- P在AB上,那么P离AB的最短距离便是 A × B / l e n A B {A×B}/{len_{AB}} A×B/lenAB,这里的乘是向量叉乘(△ABP的面积)。
- P不在AB上,那么AB·AP 和 AB·BP 肯定是一个锐角(>0)一个钝角(<0),所以这时候只要取 max(PA,PB)即可。这里的·是向量点乘。
出处:刘汝佳训练指南几何专题
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
const int rndcnt = 10;
const double eps = 1e-5;
struct Point{
double x, y;
};
struct Line{
Point s, e;
};
Line ll[maxn];
double p[rndcnt]