hdu5017 Ellipsoid (模拟退火)
Ellipsoid
题目描述
- 给定。一个要满足的椭球的方程\(ax^2+by^2+cz^2+dyz+exz+fxy=1\)
- 求球面上一个点到原点\((0,0,0)\)的距离最小。
- 有多组输入数据
解题思路
- 这题有一个麻烦的地方: 如何求满足椭球方程的点!
- 那就只能用自己浅薄的知识:求根公式。
- 我们先随机x坐标和y坐标,再带入到方程中,用求根公式算出z坐标。
- 这样就能保证所扩展的新状态一定满足条件。
- 之后的更新就和普通的模拟退火一样了。
- 具体求根方法,按照程序来看吧。反正就是移个项之后带公式。
代码
#include<bits/stdc++.h>
using namespace std;
inline void read(int &x)
{
x=0;
static int p;p=1;
static char c;c=getchar();
while(!isdigit(c)){if(c=='-')p=-1;c=getchar();}
while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();}
x*=p;
}
double a,b,c,d,e,f;
double ansx,ansy,ansz;
const double eps=1e-10;
double dis(double x,double y,double z)
{
return sqrt(x*x+y*y+z*z);
}
double calc(double x,double y)
{
double A=c;
double B=d*y+e*x;
double C=a*x*x+b*y*y+f*x*y-1.0;
double delta=B*B-4.0*A*C;
if(delta<0)return 210000000.0;
double x1=(-B+sqrt(delta))/(2.0*A);
double x2=(-B-sqrt(delta))/(2.0*A);
if(dis(x,y,x1)>dis(x,y,x2))return x2;
return x1;
}
void MNTH()
{
for(int times=1;times<=1;times++)
{
double T=10000;
while(T>eps)
{
double nowx=ansx+(rand()*2-RAND_MAX)*T;
double nowy=ansy+(rand()*2-RAND_MAX)*T;
double nowz=calc(nowx,nowy);
if(nowz==210000000.0){T*=0.99;continue;}
double delta=dis(nowx,nowy,nowz)-dis(ansx,ansy,ansz);
if(delta<0)ansx=nowx,ansy=nowy,ansz=nowz;
else if(exp(delta/T)*RAND_MAX<rand())ansx=nowx,ansy=nowy,ansz=nowz;
T*=0.99;
}
}
printf("%.6lf\n",dis(ansx,ansy,ansz));
}
int main()
{
srand(19890604);
while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF)
{
ansx=0;
ansy=0;
ansz=sqrt(1.0/c);
MNTH();
}
return 0;
}
hdu5017 Ellipsoid (模拟退火)的更多相关文章
- ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)
---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distanc ...
- HDU 5017 Ellipsoid 模拟退火第一题
为了补这题,特意学了下模拟退火算法,感觉算法本身不是很难,就是可能降温系数,步长等参数不好设置. 具体学习可以参见: http://www.cnblogs.com/heaad/archive/2010 ...
- hdu5017 Ellipsoid(旋转)
比赛的时候跳进这个大坑里,最后代码是写出来了.看到好像很多都是模拟退火做的,下面提供一个奇怪的思路吧. ax^2+by^2+cz^2+dyz+exz+fxy=1(*) 通过一些奇特的YY我们可以知道这 ...
- HDU - 5017 Ellipsoid(模拟退火法)
Problem Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance bet ...
- 模拟退火算法(西安网选赛hdu5017)
Ellipsoid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU - 5017 Ellipsoid(模拟退火)
题意 给一个三维椭球面,求球面上距离原点最近的点.输出这个距离. 题解 模拟退火. 把\(z = f(x, y)\)函数写出来,这样通过随机抖动\(x\)和\(y\)坐标就能求出\(z\). 代码 / ...
- hdu 5017 Ellipsoid(西安网络赛 1011)
Ellipsoid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDOJ 5017 Ellipsoid
第一次尝试模拟退火..... Ellipsoid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- bzoj3680模拟退火
看题意就是一道数学物理题,带权费马点 --这怎么是数学了,这也是物理的 所以要用物理方法,比如FFF 国际著名oi选手miaom曾说 模拟退火初温可以低,但是最好烧个几千次 国际著名物理课代表+1 ...
随机推荐
- python中的Init方法, new 方法 call 方法
new 方法实现单列模式思考 class Single: _single = None _single_only = None def __init__(self, value): self.v = ...
- PAT L3-010 是否完全二叉搜索树
https://pintia.cn/problem-sets/994805046380707840/problems/994805049870368768 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- CentOS查看和修改PATH环境变量的方法 profile
https://blog.csdn.net/dongheli/article/details/83987092
- 使用ThreadLocal管理Mybatis中SqlSession对象
转自http://blog.csdn.net/qq_29227939/article/details/52029065 public class MybatisUtil { private stati ...
- 关于spring的源码的理解
从最基础的Hello World开始. spring的Hello World就三行代码: public void test() { ApplicationContext context = new C ...
- tomcat8.0部署启动
http://tomcat.apache.org/download-80.cgi 打开命令行提示符窗口, 进入Tomcat安装目录, 进入bin目录下, 输入:service.bat install ...
- [转帖]Docker save and load镜像保存
Docker save and load镜像保存 https://www.cnblogs.com/zhuochong/p/10064350.html docker save 和 load 以及 imp ...
- cmake : undefined reference to dlopen, dlclose, dlsym and dlerror
链接出了问题 添加头文件 #include <dlfcn.h> 添加库 target_link_libraries(PROJECT_NAME ${CMAKE_DL_LIBS})
- 校园电商项目2(基于SSM)——模块设计
步骤一:各模块职责 步骤二:实体类设计 package com.figsprite.o2o.bean; import java.util.Date; public class Area { priva ...
- laravel5.3安装redis扩展包
1,编辑 laravel 根目录下的 composer.json 文件: "require": { "php": ">=5.6.4", ...