HDU 3644 计算几何 模拟退火

模拟退火算法总结 Metropolis准则——以概率接受新状态 固体退火问题介绍 退火是指将固体加热到足够高的温度,使分子呈随机排列状态,然后逐步降温使之冷却,最后分子以低能状态排列,固体达到某种稳定状态。 加温过程——增强粒子的热运动,消除系统原先可能存在的非均匀态; 等温过程——对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态; 冷... 阅读详情
/*
 * =====================================================================================
 *
 *       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  ---------- */

光谱预处理最简单实现方法--基于OpenSA光谱分析库 系列文章目录 “光晰本质,谱见不同”,光谱作为物质的指纹,被广泛应用于成分分析中。伴随微型光谱仪/光谱成像仪的发展与普及,基于光谱的分析技术将不只停留于工业和实验室,即将走入生活,实现万物感知,见微知著。本系列文章致力于光谱分析技术的科普和应用。 文章目录系列文章目录前言一、数据来源二、代码解读2.1 读取数据2 .2 划分数据集2 .3 返回训练集和测试集并绘制光谱图片2.4 建立1-D CNN模型2.5 训练1-D CNN模型2.6 测试1-D CNN模型2.7 运行CNN模型,并用查看结果总结 阅读详情

相关推荐

stm32f103运行FreeRTOS使用DMA实现USART1不定长接收

使用DMA是实现USART1的不定长接收和发送数据。接收采用FIFO缓存和队列的方式向应用层抛数据。首先定义接收和发送的缓存区,缓存区的大小根据收发数据量确定。DMA接收开启转移完成和转移一般中断。在中断中从缓存向FIFO转移数据。串口开启空闲中断,实现接收数据的分帧。分帧后的数据节点通过写入到队列。发送数据缓存的大小根据发送数据量调整。然后初始化串口和DMA。串口的发送数据接口函数。...

polaris_zgx的博客 1991

计算几何中的模拟退火

模拟退火(SA,Simulated Annealing) 这是一种随机算法,其实模拟退火也算一种贪心算法。但是它在搜索过程中引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。 顺便说一下爬山算法:爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。 ...

weixin_30256901的博客 184

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南

本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。

weixin_29093017的博客 483

POJ-1379 Run Away 计算几何 模拟退火

POJ-1379 Run Away 题意: 平面上给定n个点, 要求找到一个点使得到所有点的距离最大。 分析: 模拟退火, 计算到每个点的最小距离, 使得最小距离最大。 代码: #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstring&amp;gt; #include &amp;lt;algorithm&amp;gt; #include &amp;lt;cmath&amp;gt

YancyKahn 482

1. 基于STM32的1.28寸圆形IPS屏(GC9A01)驱动移植实战:软件SPI与硬件SPI双方案详解

本文详细介绍了如何在STM32平台上为1.28寸圆形IPS屏(GC9A01驱动芯片)移植驱动程序,涵盖软件SPI与硬件SPI两种实现方案。内容从引脚定义、工程搭建、GPIO配置到SPI外设初始化逐步详解,并提供了完整的测试代码,帮助开发者根据项目需求(灵活性或性能)选择合适的通信方式,快速点亮屏幕并集成到智能手表等嵌入式项目中。

weixin_42300144的博客 203

QMI8658A和QMC5883L传感器校准全攻略:从零偏校准到椭球拟合

本文详细解析了QMI8658A和QMC5883L传感器的校准方法,从零偏校准到椭球拟合,涵盖了9轴运动传感器的核心误差来源及补偿技术。通过实战案例和数学建模,帮助开发者提升传感器精度,适用于无人机、AR/VR等智能硬件应用。

weixin_29189381的博客 158

HDU 3644

模拟退火算法。。。。 这道题,呃。我怎么感觉他就是随机的。同一个代码,时而AC,时而WA。其实还真的是随机的。呵呵呵呵呵。。。因为下降火太快了,没办法,而降得慢又会。。。TLE,虽然精度提高了。 敢问,还有什么好的方法?我是在做退火算法时遇到这个练手的。 #include <iostream> #include <cmath> #include <...

weixin_30216561的博客 138

OpenClaw的引导配置(onboard)流程

脚本安装的直接安装完到引导配置界面,其他安装方式还可以直接命令到配置。

supersolon的专栏 1327

HDU 3644 模拟退火

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3644 题意:给定n个点的一个多边形,一个圆的半径,判断圆是否可以放在多边形里, 由于圆形坐标没确定,所以采用模拟退火法来算,不断地减小步长,选取n个点,点在多边形内采用穿线法判断, 精度很坑爹,调了一下午精度,在wa与tle之间徘徊20+次,吐血AC。 代码: /* **********

_rabbit的专栏 1540

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...

m0_37615458的博客 7725

STM32F407驱动OV2640摄像头全栈解析:DCMI+DMA+SCCB协同设计

图像采集是嵌入式视觉系统的基石,其核心在于传感器与MCU间的数据通路构建。原理上需理解并行接口(如DCMI)的硬件同步捕获机制、串行控制总线(如SCCB/I²C)的寄存器级配置逻辑,以及DMA在高吞吐数据搬运中的关键作用。技术价值体现在解放CPU、保障实时性、降低功耗,并支撑JPEG压缩与RGB565直显等差异化应用。典型场景包括智能终端实时预览、低带宽图像上传、工业现场视频监控及教学实验平台搭建。本文以STM32F407与OV2640集成实践为载体,深入剖析DCMI时序约束、SCCB软件模拟实现及DMA循

weixin_36151775的博客 180

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

Tczxw的专栏 604

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

✅ 精选推荐文章 1万+

HDU-3644 A Chocolate Manufacturer's Problem 计算几何 模拟退火

HDU-3644 A Chocolate Manufacturer’s Problem 题意: 给定一个多边形, 判断这个多边形中是否可以放入一个半径为r的圆. 分析: 发现不知从何入手时就开始模拟退火吧. 随机找出圆心坐标, 主要就是判断某个点是否在多边形内. 这题wa和tle了好多次, 参数选择需要些微调, 模拟退火有风险, 罚时伤不起. 代码: #include &lt;algori...

YancyKahn 449

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

twh233的算法blog 504

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

模拟退火算法——自我总结

物理退火过程: 什么是退火:退火是指将固体加热到足够高的温度,使分子呈随机排列状态,然后逐步降温使之冷却,最后分子以低能状态排列,固体达到某种稳定状态。 加温过程——增强粒子的热运动,消除系统原先可能存在的非均匀态; 等温过程——对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态; 冷却过程——使粒子热运动减弱并渐趋有序,系

gmh1314的博客 3万+

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  一开始以为是半平面交,果断看大家的提交时间和代码长度就不像是,不过还是提

窝不是爱酱,喵~~~~ 2036

hdu 3644 A Chocolate Manufacturer's Problem(模拟退火)

题意:求一个多边形中能否放入一个半径为R的圆。。。。

664

判断两条线段是否相交—(向量叉乘)

问题:给出两条线段,问两线段是否相交? 向量叉乘(行列式计算):向量a(x1,y1),向量b(x2,y2): 首先我们要明白一个定理:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,表示向量b在向量a的逆时针方向;若等于0,表示向量a与向量b平行。(顺逆时针是指两向量平移至起点相连,从某个方向旋转到另一个向量小于180度)。如下...

weixin_30782293的博客 4282

模拟退火算法

参考:https://m-sea.blog.luogu.org/qian-tan-SA 思想:看当前解是否小于之前的最优解,有则接受,那局部最优的就是全局最优么?非也 在寻找到一个局部最优解时,赋予了它一个跳出去的概率,也就有更大的机会能找到全局最优解。 POJ 2420 求平面内到一堆点距离最小的那个点 #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;cstdio&amp;amp;..

CODER的博客 1206

【BZOJ3680】吊打XXX 计算几何 广义费马点+模拟退火(爬山算法)

做题之前: 对于一个点,使它到每个分身的距离*这个fen'shen

Water_Killer 1823

HDU 4013 图论 树的最小表示

/******************************************************************************* 去年上海赛区热身赛的一道题,树的最小表示模板题。解法就是用二进制枚举所有可能的联通子图,然后 求所有联通子图的最小表示,要注意的是对于某一个联通子图,最小表示需要枚举联通子图里的所有的点,然 后从这些点开始进行dfs,dfs过程中进

源码力量 2521

HDU 4121 模拟

/**************************************************************************************************** 坑爹的模拟题~注意这两种情况:黑方的将能直接飞过去杀了红方的将,还有将走一步能把红方别的子给吃了。。。 ******************************************

源码力量 1773

HDU 4049 状态压缩DP

/******************************************************************************* 去年北京赛区网络赛水题,状态压缩DP,一开始TLE,然后发现是没初始化,应该用空间换时间来着, 接着WA,搞了半天没搞明白。。。最后发现发现一个小小的纰漏~~~ 解法就是建立状态dp[M][1 << N],用第一个状态表示

源码力量 1675

HDU 1512 左式堆 + 并查集

/* * ===================================================================================== * * Filename: hdu1512.cpp * * Description: Leftist Heap + Union Find Set * * Version

源码力量 1616

HDU 4036 物理坑爹题

/******************************************************************************* 坑爹的地方比较多,首先所有质量都是没用的,因为无摩擦力;其次坐标最好都用double表示;还有那个 土豆是的坐标是相对于第一个peak的坐标,第四貌似有土豆可以不在peak的范围内。。。以后找min/max值 还是用第一个元素做标记

源码力量 1590
上一篇: HDU 4031 树状数组 区间更新及点询问
下一篇: fedora16 mysql命令总结(持续更新)
codeforces_sphinx
博客等级 码龄15年 32粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值