【2019-WHU网络赛-A.circle】模拟退火

题意

在坐标轴上给出n条线段,圆心在x轴的[0,L]上移动,在该圆不和任何线段相交的情况下最大的半径是多少?

题解

模拟退火,因为模拟退火可以并行执行,所以先随机出多个点的位置(多组可能解),然后对这些解进行模拟退火,得出点到线段的最短距离用的是失量法。

点与线段一共会有下列两种位置。

  1. P在AB上,那么P离AB的最短距离便是 A × B / l e n A B {A×B}/{len_{AB}} A×B/lenAB,这里的乘是向量叉乘(△ABP的面积)。
  2. 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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值