/*
* =====================================================================================
*
* Filename: hdu3644.cpp
*
* Description: Calculate Geometry -- Simulated annealing
*
* Version: 1.0
* Created: 2012年01月21日 10时41分15秒
* Revision: none
* Compiler: gcc
*
* Author: SphinX (Yuxiang Ye), sphinx2010@yahoo.cn
* Organization:
*
* =====================================================================================
*/
/*
* 10年杭州网络赛的一道题,碉堡了~貌似是我A的最艰难的题了,虽然一开始
*就看出是模拟退火,但无奈计算几何基础太差,敲的过程中各种错误,然后又重新学
*了遍计算几何基本功,但还是各种WA跟TLE,最后发现是精度问题。。。
* 其中辛苦一言难尽。。。
*/
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
typedef double LF;
const LF eps = 1e-3;
const int MAXN = 104;
struct Point
{
LF x, y;
Point(){}
Point(const LF _x, const LF _y)
{
x = _x;
y = _y;
}
}; /* ---------- end of struct Point ---------- */
typedef struct Point Point;
struct Segment
{
Point ps, pe;
Segment(){}
Segment(const Point _ps, const Point _pe)
{
ps = _ps;
pe = _pe;
}
}; /* ---------- end of struct Segment ---------- */
typedef struct Segment Segment;
int n;
LF radius, min_dist[MAXN];
Point pnt[MAXN], tmp[MAXN];
Segment seg[MAXN];
/*
* === FUNCTION ======================================================================
* Name: dblcmp
* Description:
* =====================================================================================
*/
int
dblcmp ( const LF & x )
{
return fabs(x) < eps ? 0 : (x < 0.0 ? -1 : 1);
} /* ----- end of function dblcmp ----- */
/*
* === FUNCTION ======================================================================
* Name: xmult
* Description:
* =====================================================================================
*/
LF
xmult ( const Point & p1, const Point & p2, const Point & p0 )
{
LF vx[2] = {p1.x - p0.x, p2.x - p0.x};
LF vy[2] = {p1.y - p0.y, p2.y - p0.y};
return vx[0] * vy[1] - vx[1] * vy[0];
} /* ----- end of function xmult ----- */
/*
* === FUNCTION ======================================================================
* Name: pnt2pnt_dist
* Description:
* =====================================================================================
*/
LF
pnt2pnt_dist ( const Point & pa, const Point &pb )
{
return sqrt((pa.x - pb.x) * (pa.x - pb.x)
+ (pa.y - pb.y) * (pa.y - pb.y));
} /* ----- end of function pnt2pnt_dist ----- */
/*
* === FUNCTION ======================================================================
* Name: pnt2seg_dist
* Description:
* =====================================================================================
*/
LF
pnt2seg_dist ( const Point & pt, const Segment & seg )
{
LF a = pnt2pnt_dist(pt, seg.pe);
if( a < eps )
{
return a;
}
LF b = pnt2pnt_dist(pt, seg.ps);
if( b < eps )
{
return b;
}
LF c = pnt2pnt_dist(seg.pe, seg.ps);
if( c < eps )
{
return a;
}
if( a * a >= b * b + c * c )
{
return b;
}
if( b * b >= a * a + c * c )
{
return a;
}
LF l = (a + b + c) * 0.5;
LF s = sqrt(l * (l - a) * (l - b) * (l - c));
return 2.0 * s / c;
} /* ----- end of function pnt2seg_dist ----- */
/*
* === FUNCTION ======================================================================
* Name: pnt2poly_dist
* Description:
* =====================================================================================
*/
LF
pnt2poly_dist ( const Point & pt )
{
LF mn = pnt2seg_dist(pt, seg[0]);
for( int i = 1; i < n ; ++i )
{
mn = min(mn, pnt2seg_dist(pt, seg[i]));
}
return mn;
} /* ----- end of function pnt2poly_dist ----- */
/*
* === FUNCTION ======================================================================
* Name: seg_cross_judge
* Description:
* =====================================================================================
*/
bool
seg_cross_judge ( const Segment & u, const Segment & v )
{
return max(u.pe.x, u.ps.x) >= min(v.pe.x, v.ps.x)
&& max(v.pe.x, v.ps.x) >= min(u.pe.x, u.ps.x)
&& max(u.pe.y, u.ps.y) >= min(v.pe.y, v.ps.y)
&& max(v.pe.y, v.ps.y) >= min(u.pe.y, u.ps.y)
&& -1 == dblcmp(xmult(v.ps, u.pe, u.ps)) * dblcmp(xmult(v.pe, u.pe, u.ps))
&& -1 == dblcmp(xmult(u.ps, v.pe, v.ps)) * dblcmp(xmult(u.pe, v.pe, v.ps));
} /* ----- end of function seg_cross_judge ----- */
/*
* === FUNCTION ======================================================================
* Name: pnt_inside_judge
* Description:
* =====================================================================================
*/
bool
pnt_inside_judge ( const Point & pt )
{
LF ang = rand() + 0.0;
Point ps = Point(pt.x + 10000.0 * cos(ang), pt.y + 10000.0 * sin(ang));
Segment sg = Segment(pt, ps);
int cnt = 0;
for( int i = 0; i < n ; ++i )
{
if (seg_cross_judge(sg, seg[i]))
{
++cnt;
}
}
return cnt % 2;
} /* ----- end of function pnt_inside_judge ----- */
/*
* === FUNCTION ======================================================================
* Name: exist_judge
* Description: 模拟退火
* =====================================================================================
*/
bool
exsist_judge ()
{
LF maxr = 0.0;
for( int i = 0; i < n ; ++i )
{
tmp[i].x = (pnt[i].x + pnt[i + 1].x) * 0.5;
tmp[i].y = (pnt[i].y + pnt[i + 1].y) * 0.5;
min_dist[i] = pnt2poly_dist(tmp[i]);
}
for (int i = 0; i < n - 1; ++i)
{
for (int j = i + 1; j < n; ++j)
{
maxr = max(maxr, pnt2pnt_dist(pnt[i], pnt[j]));
}
}
while (maxr > 1e-3)
{
for( int k = 0; k < 5 ; ++k )
{
for (int i = 0; i < n; ++i)
{
LF ang = rand() + 0.0;
Point pk = Point(tmp[i].x + maxr * cos(ang), tmp[i].y + maxr * sin(ang));
if (!pnt_inside_judge(pk))
{
continue ;
}
LF buf = pnt2poly_dist(pk);
if (buf + eps > radius)
{
return true;
}
if (buf > min_dist[i])
{
min_dist[i] = buf;
tmp[i] = pk;
}
}
}
maxr *= 0.9;
}
return false;
} /* ----- end of function exist_judge ----- */
/*
* === FUNCTION ======================================================================
* Name: main
* Description: VIM自动生成的代码,比较吓人~
* =====================================================================================
*/
int
main ( int argc, char *argv[] )
{
srand(static_cast<unsigned int>(time(NULL)));
while( scanf ( "%d", &n ), n )
{
for( int i = 0; i < n ; ++i )
{
scanf ( "%lf %lf", &pnt[i].x, &pnt[i].y );
}
scanf ( "%lf", &radius );
pnt[n] = pnt[0];
for( int i = 0; i < n ; ++i )
{
seg[i] = Segment(pnt[i], pnt[i + 1]);
}
cout << (exsist_judge() ? "Yes" : "No") << endl;
}
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */相关推荐
stm32f103运行FreeRTOS使用DMA实现USART1不定长接收
使用DMA是实现USART1的不定长接收和发送数据。接收采用FIFO缓存和队列的方式向应用层抛数据。首先定义接收和发送的缓存区,缓存区的大小根据收发数据量确定。DMA接收开启转移完成和转移一般中断。在中断中从缓存向FIFO转移数据。串口开启空闲中断,实现接收数据的分帧。分帧后的数据节点通过写入到队列。发送数据缓存的大小根据发送数据量调整。然后初始化串口和DMA。串口的发送数据接口函数。...
计算几何中的模拟退火
模拟退火(SA,Simulated Annealing) 这是一种随机算法,其实模拟退火也算一种贪心算法。但是它在搜索过程中引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。 顺便说一下爬山算法:爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。 ...
Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南
本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。
POJ-1379 Run Away 计算几何 模拟退火
POJ-1379 Run Away 题意: 平面上给定n个点, 要求找到一个点使得到所有点的距离最大。 分析: 模拟退火, 计算到每个点的最小距离, 使得最小距离最大。 代码: #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; #include &lt;cmath&gt
1. 基于STM32的1.28寸圆形IPS屏(GC9A01)驱动移植实战:软件SPI与硬件SPI双方案详解
本文详细介绍了如何在STM32平台上为1.28寸圆形IPS屏(GC9A01驱动芯片)移植驱动程序,涵盖软件SPI与硬件SPI两种实现方案。内容从引脚定义、工程搭建、GPIO配置到SPI外设初始化逐步详解,并提供了完整的测试代码,帮助开发者根据项目需求(灵活性或性能)选择合适的通信方式,快速点亮屏幕并集成到智能手表等嵌入式项目中。
QMI8658A和QMC5883L传感器校准全攻略:从零偏校准到椭球拟合
本文详细解析了QMI8658A和QMC5883L传感器的校准方法,从零偏校准到椭球拟合,涵盖了9轴运动传感器的核心误差来源及补偿技术。通过实战案例和数学建模,帮助开发者提升传感器精度,适用于无人机、AR/VR等智能硬件应用。
HDU 3644
模拟退火算法。。。。 这道题,呃。我怎么感觉他就是随机的。同一个代码,时而AC,时而WA。其实还真的是随机的。呵呵呵呵呵。。。因为下降火太快了,没办法,而降得慢又会。。。TLE,虽然精度提高了。 敢问,还有什么好的方法?我是在做退火算法时遇到这个练手的。 #include <iostream> #include <cmath> #include <...
OpenClaw的引导配置(onboard)流程
脚本安装的直接安装完到引导配置界面,其他安装方式还可以直接命令到配置。
HDU 3644 模拟退火
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3644 题意:给定n个点的一个多边形,一个圆的半径,判断圆是否可以放在多边形里, 由于圆形坐标没确定,所以采用模拟退火法来算,不断地减小步长,选取n个点,点在多边形内采用穿线法判断, 精度很坑爹,调了一下午精度,在wa与tle之间徘徊20+次,吐血AC。 代码: /* **********
win10 离线安装.Net Framework3.5
起因,安装软件比如3dmax2014等需要.Net Framework3.5支撑,那么需要安装低版本的.Net Framework3.5 闲话少说。 1.下载 NetFx3.cab 链接: https://pan.baidu.com/s/124to7F3BOy4yAlY61OjbDg 提取码: kixu 2.将NetFx3.cab 放入 系统盘的windows目录下(示例 C:\Wi...
STM32F407驱动OV2640摄像头全栈解析:DCMI+DMA+SCCB协同设计
图像采集是嵌入式视觉系统的基石,其核心在于传感器与MCU间的数据通路构建。原理上需理解并行接口(如DCMI)的硬件同步捕获机制、串行控制总线(如SCCB/I²C)的寄存器级配置逻辑,以及DMA在高吞吐数据搬运中的关键作用。技术价值体现在解放CPU、保障实时性、降低功耗,并支撑JPEG压缩与RGB565直显等差异化应用。典型场景包括智能终端实时预览、低带宽图像上传、工业现场视频监控及教学实验平台搭建。本文以STM32F407与OV2640集成实践为载体,深入剖析DCMI时序约束、SCCB软件模拟实现及DMA循
HDU 3644 模拟退火的火候控制
#include #define LL long long #define eps 1e-7 #define zero(a) fabs(a)<eps const int INF = 0x3f3f3f3f; const int N = 20; const double pi = acos(-1.0); int n; using namespace std; struct Point { d
uniapp - 热更新提示:WGT安装包中manifest.json文件不存在 | unexpected EOF!报错详细解决,完美搞定WGT安装包中WWW目录下manifest.json不存在问题
uniapp,安卓android,苹果ios,热更新,热更新code:-1202报错,,WGT热更新报错,uniapp热更新wgt出现报错manifest.json文件不存,uniapp安卓苹果软件热更新时出现错误unexpected EOF!如何解决,怎么解决热更新wgt报错,app新版本下载安装报错WGT安装包中manifest.json文件不存在,WGT安装包中WWW目录下manifest.json不存在,uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误,uniapp-wgt
HDU-3644 A Chocolate Manufacturer's Problem 计算几何 模拟退火
HDU-3644 A Chocolate Manufacturer’s Problem 题意: 给定一个多边形, 判断这个多边形中是否可以放入一个半径为r的圆. 分析: 发现不知从何入手时就开始模拟退火吧. 随机找出圆心坐标, 主要就是判断某个点是否在多边形内. 这题wa和tle了好多次, 参数选择需要些微调, 模拟退火有风险, 罚时伤不起. 代码: #include <algori...
Camera2Demo
在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
hdu 3644(几何模拟退火
传送门 A Chocolate Manufacturer's Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2360 Accepted Submission(s): 456
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
模拟退火算法——自我总结
物理退火过程: 什么是退火:退火是指将固体加热到足够高的温度,使分子呈随机排列状态,然后逐步降温使之冷却,最后分子以低能状态排列,固体达到某种稳定状态。 加温过程——增强粒子的热运动,消除系统原先可能存在的非均匀态; 等温过程——对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态; 冷却过程——使粒子热运动减弱并渐趋有序,系
HDU 3644 A Chocolate Manufacturer's Problem(模拟退火)
转载请注明出处,谢谢http://blog.youkuaiyun.com/acm_cxlove/article/details/7854526 by---cxlove 题目:一个任意多边形,判断是否能放入一个半径为r的圆 http://acm.hdu.edu.cn/showproblem.php?pid=3644 一开始以为是半平面交,果断看大家的提交时间和代码长度就不像是,不过还是提
hdu 3644 A Chocolate Manufacturer's Problem(模拟退火)
题意:求一个多边形中能否放入一个半径为R的圆。。。。
判断两条线段是否相交—(向量叉乘)
问题:给出两条线段,问两线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,表示向量b在向量a的逆时针方向;若等于0,表示向量a与向量b平行。(顺逆时针是指两向量平移至起点相连,从某个方向旋转到另一个向量小于180度)。如下...
模拟退火算法
参考:https://m-sea.blog.luogu.org/qian-tan-SA 思想:看当前解是否小于之前的最优解,有则接受,那局部最优的就是全局最优么?非也 在寻找到一个局部最优解时,赋予了它一个跳出去的概率,也就有更大的机会能找到全局最优解。 POJ 2420 求平面内到一堆点距离最小的那个点 #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;..
【BZOJ3680】吊打XXX 计算几何 广义费马点+模拟退火(爬山算法)
做题之前: 对于一个点,使它到每个分身的距离*这个fen'shen
HDU 4013 图论 树的最小表示
/******************************************************************************* 去年上海赛区热身赛的一道题,树的最小表示模板题。解法就是用二进制枚举所有可能的联通子图,然后 求所有联通子图的最小表示,要注意的是对于某一个联通子图,最小表示需要枚举联通子图里的所有的点,然 后从这些点开始进行dfs,dfs过程中进
HDU 4121 模拟
/**************************************************************************************************** 坑爹的模拟题~注意这两种情况:黑方的将能直接飞过去杀了红方的将,还有将走一步能把红方别的子给吃了。。。 ******************************************
HDU 4049 状态压缩DP
/******************************************************************************* 去年北京赛区网络赛水题,状态压缩DP,一开始TLE,然后发现是没初始化,应该用空间换时间来着, 接着WA,搞了半天没搞明白。。。最后发现发现一个小小的纰漏~~~ 解法就是建立状态dp[M][1 << N],用第一个状态表示
HDU 1512 左式堆 + 并查集
/* * ===================================================================================== * * Filename: hdu1512.cpp * * Description: Leftist Heap + Union Find Set * * Version
HDU 4036 物理坑爹题
/******************************************************************************* 坑爹的地方比较多,首先所有质量都是没用的,因为无摩擦力;其次坐标最好都用double表示;还有那个 土豆是的坐标是相对于第一个peak的坐标,第四貌似有土豆可以不在peak的范围内。。。以后找min/max值 还是用第一个元素做标记
1991



被折叠的 条评论
为什么被折叠?



