Ural 1520 Empire Strikes Back(模拟退火)

最近研究了下模拟退火,首先戳这里>_<顾研08年集训队论文,讲的非常详细

首先随机20个点作为候选解,以此扩展来确定距离工厂最近的点的最远的距离是多少。但是有需要注意到扩展点在边界的情况,因为边界是圆所以很难继续扩展,如论文中提到的两种情况。1.是两工厂垂直平分线与边界交点2.一个工厂的圆与边界相切。单独判断即可。

其中有个很蛋疼的地方,我之前距离用了很多次sqrt,T成狗,比较距离时只需比较距离平方,答案最后再开根即可

代码:https://github.com/mlz000/Ural/blob/master/1502(%E6%A8%A1%E6%8B%9F%E9%80%80%E7%81%AB).cpp

#include<iostream>//模拟退火
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
#define sqr(x)	((x)*(x))
const int N=305;
const double Pi=acos(-1.0),eps=1e-9,inf=1e10;
int n;
double r;
struct Point{
	double x,y,d;
}a[N],b[25],tmp,tmp1,tmp2;
double dis(double x1,double y1,double x2,double y2){
	return sqr(x1-x2)+sqr(y1-y2);
}
int dcmp(double x){
	if(x<eps)	return -1;
	return x>eps;
}
void calc(Point &p){
	p.d=inf;
	if(dcmp(sqr(p.x)+sqr(p.y)-r*r)>0){
		p.d=0;
		return;
	}
	for(int i=1;i<=n;++i)	p.d=min(p.d,dis(p.x,p.y,a[i].x,a[i].y));
}
int main(){
	while(~scanf("%d%lf",&n,&r)){
		for(int i=1;i<=n;++i)	scanf("%lf%lf",&a[i].x,&a[i].y);
		for(int i=1;i<=20;++i){
			double len=(rand()%100)/100.0*r;
			double ang=(rand()%100)/100.0*2.0*Pi;
			b[i].x=len*cos(ang);
			b[i].y=len*sin(ang);
			calc(b[i]);
		}
		double delta=r*2/sqrt(20.0);
		for(;delta>1e-7;delta*=0.6)
			for(int i=1;i<=20;++i)
				for(int j=1;j<=30;++j){
					double ang=(rand()%100)/100.0*2.0*Pi;
					tmp.x=b[i].x+delta*cos(ang);
					tmp.y=b[i].y+delta*sin(ang);
					calc(tmp);
					if(tmp.d>b[i].d)	b[i]=tmp;
				}
		double ans=0.0;
		for(int i=1;i<=20;++i)	ans=max(ans,b[i].d);
		for(int i=1;i<=n;++i)
			for(int j=i+1;j<=n;++j){
				double A,B,C,d,s,xx,yy;
				A=2*(a[i].x-a[j].x),B=2*(a[i].y-a[j].y),C=sqr(a[j].x)+sqr(a[j].y)-sqr(a[i].x)-sqr(a[i].y);
				s=A*A+B*B;
				d=r*r*s-sqr(C);//d=d*(A^2+B^2)
				if(d+eps<0)	continue;
				if(d<eps)	d=0;
				else d=sqrt(d);
				if(s==0)	continue;
				xx=-A*C;
				yy=-B*C;
				tmp1.x=(xx+B*d)/s,tmp1.y=(yy-A*d)/s;
				tmp2.x=(xx-B*d)/s,tmp2.y=(yy+A*d)/s;
				calc(tmp1);
				ans=max(ans,tmp1.d);
				calc(tmp2);
				ans=max(ans,tmp2.d);
			}
		for(int i=1;i<=n;++i){
			double d=sqrt(sqr(a[i].x)+sqr(a[i].y));
			if(dcmp(d)<=0)	continue;
			tmp.x=a[i].x*r/d;
			tmp.y=a[i].y*r/d;
			calc(tmp);
			ans=max(ans,tmp.d);
			tmp.x=-tmp.x;
			tmp.y=-tmp.y;
			calc(tmp);
			ans=max(ans,tmp.d);
		}
		printf("%.8lf\n",sqrt(ans));
	}
	return 0;
}

Ural 1520 Empire Strikes Back(模拟退火)

时间: 2024-08-06 07:58:14

Ural 1520 Empire Strikes Back(模拟退火)的相关文章

【转】[专题学习][计算几何]

原文地址:http://www.cnblogs.com/ch3656468/archive/2011/03/02/1969303.html 基本的叉积.点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了. 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自我校大牛韬哥: http://www.o

JSONP的诞生、原理及应用实例

问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的代码在codepen上,我不能将我的数据放到codepen网站上,那么我只能放到我自己的服务器中,这样的话,就无法通过Ajax访问到这个数据了. 解决: 想要实现这种跨域资源请求,有很多解决办法,列举出一部分: 让服务器来加载远程数据,然后在用户请求时提供给浏览器. 用<script>或是<

吐血推荐250部必看电影下载 IMDB TOP 250 download

中文名: IMDB Top 250合辑 TLF-MiniSD收藏版英文名: IMDB Top 250 TLF-MiniSD Collection版本: (更新至TOP119)[MiniSD]发行日期: 2010年地区: 美国语言: 英语 简介: IMDB Top 250合辑 TLF-MiniSD收藏版制作&发行:TLF HALFCD TeamTLF耗时2年精心打造,虎年开篇扛鼎之作 IMDB TOP 250邀您共赏一个世纪的经典 IMDB TOP250是IMDB网站里很受欢迎的特色栏目,里面列出

Web挖掘技术

一.数据挖掘 数据挖掘是运用计算机及信息技术,从大量的.不全然的数据集中获取隐含在当中的实用知识的高级过程.Web 数据挖掘是从数据挖掘发展而来,是数据挖掘技术在Web 技术中的应用.Web 数据挖掘是一项综合技术,通过从Internet 上的资源中抽取信息来提高Web 技术的利用效率,也就是从Web 文档结构和试用的集合中发现隐含的模式. 数据挖掘涉及的学科领域和方法非常多,有多种分类法. (1)依据挖掘对象分:关系数据库.面向对象数据库.空间数据库.时序数据库.DNA 数据库.多媒体数据库.

movie-recommendation-with-mllib

In this chapter, we will use MLlib to make personalized movie recommendations tailored for you. We will work with 10 million ratings from 72,000 users on 10,000 movies, collected by MovieLens.  This dataset is pre-loaded in the HDFS on your cluster i

全球100部最佳影片排行

全球100部最佳影片排行 以下是IMDB(美国著名影评网站)网民评出全球100部最佳影片 :  1. <教父>The Godfather 1972年 8.9 分  科波拉黑帮经典<教父>的首部,派拉蒙公司最成功的影片之一,坐稳IMDB头把交椅应属,众望所归.虽然评论界一致对<教父>系列的第2集推崇有佳,但大多数影迷似乎还是对<教父>情有独钟,这可能与马龙·白兰度极具个力的表演有关,直到今天他那种含 糊沙哑的声音与神秘莫测的表情都依然叫人着迷.  2. <

BBC票选出的100部最经典美国电影,你看过几部?

BBC票选出的100部最经典美国电影,你看过几部? 导读:BBC票选出的100部最经典美国电影,你看过几部? 2015-07-27欧美内参欧美内参欧美内参 微信号zoujinoumei 功能介绍<欧美内参>唯一号,国内首个全面解读欧美社会的微媒体,辐射范围遍布全球130多个国家,深刻.独到.精致.有料.犀牛财经联盟发起人之一,蓝鲸财经记者联盟.北平财经公社资深成员.“有一种鸟儿是永远关不住的,它的每一片羽翼上都沾满了自由的光辉.” 点击上面蓝色字关注,即可免费订阅欧美内参. 欧美 1.公民凯恩

8、列表:ion-list

1.基本样式 no-lines 属性 隐藏列表项之间的分割符 inset 属性 去掉 ion-list的 外边框. 默认 的 ion-list 是有外边框的. /* ---示例代码----*/ <ion-content> <ion-list no-lines> <ion-item>no-lines</ion-item> <ion-item>no-lines</ion-item> <ion-item>no-lines<

R语言 recommenderlab 包

recommend li_volleyball 2016年3月20日 library(recommenderlab) ## Warning: package 'recommenderlab' was built under R version 3.2.4 ## Loading required package: Matrix ## Loading required package: registry ## Loading required package: arules ## ## Attach