cf2c(模拟退火 步长控制
https://www.luogu.org/problem/CF2C
题意:在平面上有三个没有公共部分的圆,求平面上一点使得到三个圆的切线的夹角相等。(若没答案满足条件,则不打印
思路:可用模拟退火算法来枚举答案点,可过,然而应该不是正解。先设一个最优解和初始步长,然后以当前步长不断搜索最优解更新答案,若答案不能更新,则步长减半再搜索,直到精度达到要求结束算法。
#include<cstdio>
#include<cmath>
const double EPS=1E-5; //控制精度
struct Point {
double x,y;
double r;
}P[3];
double Get(double x,double y,const Point b) { //求两点之间的距离
return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y));
}
double Check(double x,double y) { //估价函数
double t[3],delta[3],ret=0.0; //t为当前视角,delta表示误差值
for(int i=0;i<3;++i)
t[i]=Get(x,y,P[i])/P[i].r;
for(int i=0;i<3;++i) {
delta[i]=t[i]-t[(i+1)%3];
ret+=delta[i]*delta[i];
}
return ret; //返回误差的平方和
}
int main() {
bool mark;
double x=0.0,y=0.0;
for(int i=0;i<3;++i) {
scanf("%lf%lf%lf",&P[i].x,&P[i].y,&P[i].r);
x+=P[i].x/3;
y+=P[i].y/3; //设置近似最优解为三个圆圆心构成的三角形重心
}
for(double t=1.0,delta;t>EPS;) { //初始步长为1
mark=0; //搜索标记
delta=Check(x,y);
if(Check(x+t,y)<delta) { //搜索更优解
x+=t;
mark=1;
}
else if(Check(x-t,y)<delta) {
x-=t;
mark=1;
}
else if(Check(x,y+t)<delta) {
y+=t;
mark=1;
}
else if(Check(x,y-t)<delta) {
y-=t;
mark=1;
}
if(!mark) //搜索不到调整步长
t/=2;
}
if(fabs(Check(x,y))<EPS) //检查
printf("%.5lf %.5lf",x,y);
return 0;
}
cf2c(模拟退火 步长控制的更多相关文章
- 4. Scala程序流程控制
4.1 程序流程控制说明 在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句,顺序控制,粉质控制,循环控制 温馨提示:Scala语言中控制结构和Java语言中的 ...
- 【IScroll深入学习】解决IScroll疑难杂症
前言 在去年,我们对IScroll的源码进行了学习,并且分离出了一段代码自己使用,在使用学习过程中发现几个致命问题: ① 光标移位 ② 文本框找不到(先让文本框获取焦点,再滑动一下,输入文字便可重现) ...
- CMA-ES 算法
CMA-ES 算法 一.算法介绍 CMA-ES是Covariance Matrix Adaptation Evolutionary Strategies的缩写,中文名称是协方差矩阵自适应进化策略,主要 ...
- 【IScroll深入学习】突破移动端黑暗的利器(上)
前言 在去年,我们对IScroll的源码进行了学习,并且分离出了一段代码自己使用,在使用学习过程中发现几个致命问题: ① 光标移位 ② 文本框找不到(先让文本框获取焦点,再滑动一下,输入文字便可重现) ...
- shell中的循环
shell中的循环 for循环 类似于C语言的步长控制 例如: ;i<=;i++)); ); done 将1到10,依次乘以4,然后打印出来. 这里顺便提一下,shell里面表达式的计算,可以有 ...
- 排序算法 & 迷宫的深度, 广度优先
内容提要 1. 我掌握的排序算法的时间复杂度 2. 我掌握的6种排序算法(插入, 冒泡, 选择, 归并, 快速, 希尔) 3. 迷宫的搜索方法(深度优先 + 广度优先) 各种排序的时间复杂度 名称 稳 ...
- The Robust Fuzzy C-means
摘要: 基于FCM的在图像处理方面对噪声敏感的不足,本文通过引入空间模型建立空间模糊C均值聚类提高算法的鲁棒性,在此基础上,结合抑制式对算法进一步优化.最后,给图像加不同程度的噪声,通过MATLAB编 ...
- 分布式ID方案有哪些以及各自的优劣势,我们当如何选择
作者介绍 段同海,就职于达达基础架构团队,主要参与达达分布式ID生成系统,日志采集系统等中间件研发工作. 背景 在分布式系统中,经常需要对大量的数据.消息.http请求等进行唯一标识,例如:在分布式系 ...
- python简单入门
一. 初识python. 1. 认识计算机 CPU(大脑) 3GHZ + 内存(DDR4) + 主板 + 电源(心脏)+ 显示器 + 键盘 +鼠标+ 显卡 + 硬盘 80MB/s 操作系统 windo ...
随机推荐
- 170830-关于JdbcTemplate的知识点
1.Spring提供的一个操作数据库的技术JdbcTemplate,是对Jdbc的封装.语法风格非常接近DBUtils. JdbcTemplate可以直接操作数据库,加快效率,而且学这个JdbcTem ...
- jquery attr()方法获取input的checked属性问题
问题:经常使用jQuery插件的attr方法获取checked属性值,获取的值的大小为未定义,此时可以用prop方法获取其真实值,下面介绍这两种方法的区别: 1.通过prop方法获取checked属性 ...
- python中的实例属性和类属性
在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞 ...
- P3373线段树2
#include<bits/stdc++.h> using namespace std; typedef long long ll; ; ll sum[N<<],lazy1[N ...
- MySQL与MongoDB的不同
数据存放的巨大不同
- springmvc+ehcache简单例子
这里采用的是spring3.2.ehcache2.7.tomcat7.0(必须) 1.web.xml <?xml version="1.0" encoding="U ...
- Free Pascal User’s Guide
https://www.freepascal.org/docs-html/current/user/user.html
- KETTLE——(三)数据输出
数据输出和数据输入基本差不多,KETTLE本身支持的数据输出方式也特别多,还是以数据库输出为例. 打开表输出的界面,简单介绍一下其功能: 就这个界面,如果不勾选[指定数据库字段],KETTLE ...
- C++笔记(5)——浮点数的比较
判断是否相等 因为一个浮点数的存储并不总是精确的,例如在经过大量计算之后可能会将3.14保存为3.1400000000001或者3.1439999999999,这时候如果直接用==来比较这两个数的话会 ...
- 20190922 On Java8 第二十一章 数组
第二十一章 数组 一等对象 对象数组和基元数组在使用上是完全相同的.唯一的不同之处就是对象数组存储的是对象的引用,而基元数组则直接存储基本数据类型的值. 多维数组 Array.deepToString ...