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 (模拟退火)的更多相关文章

  1. ACM学习历程——HDU5017 Ellipsoid(模拟退火)(2014西安网赛K题)

    ---恢复内容开始--- Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distanc ...

  2. HDU 5017 Ellipsoid 模拟退火第一题

    为了补这题,特意学了下模拟退火算法,感觉算法本身不是很难,就是可能降温系数,步长等参数不好设置. 具体学习可以参见: http://www.cnblogs.com/heaad/archive/2010 ...

  3. hdu5017 Ellipsoid(旋转)

    比赛的时候跳进这个大坑里,最后代码是写出来了.看到好像很多都是模拟退火做的,下面提供一个奇怪的思路吧. ax^2+by^2+cz^2+dyz+exz+fxy=1(*) 通过一些奇特的YY我们可以知道这 ...

  4. HDU - 5017 Ellipsoid(模拟退火法)

    Problem Description Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance bet ...

  5. 模拟退火算法(西安网选赛hdu5017)

    Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  6. HDU - 5017 Ellipsoid(模拟退火)

    题意 给一个三维椭球面,求球面上距离原点最近的点.输出这个距离. 题解 模拟退火. 把\(z = f(x, y)\)函数写出来,这样通过随机抖动\(x\)和\(y\)坐标就能求出\(z\). 代码 / ...

  7. hdu 5017 Ellipsoid(西安网络赛 1011)

    Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  8. HDOJ 5017 Ellipsoid

    第一次尝试模拟退火..... Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  9. bzoj3680模拟退火

    看题意就是一道数学物理题,带权费马点   --这怎么是数学了,这也是物理的 所以要用物理方法,比如FFF 国际著名oi选手miaom曾说 模拟退火初温可以低,但是最好烧个几千次 国际著名物理课代表+1 ...

随机推荐

  1. python文件、文件夹的移动、复制、删除、重命名

    import os.path ,shutil shutil.copytree("G://qqfile","G://new_qqfile")# 第一个是原来的文件 ...

  2. ad2017安装以及破解

    1.破Ad破解https://wenku.baidu.com/view/5e23a78e2e3f5727a5e962dd.html 2. Ad 汉化https://jingyan.baidu.com/ ...

  3. Mysql的使用,常用的SQL语句

    一.启动mysql服务 启动mysql服务: systemctl start mysqld.service root用户登录mysql: 修改root 密码: alter user 'root'@'l ...

  4. css小demo

    span{ color: #ccc; float: right; font-weight: bold; display: inline-block; border-right: solid 1px # ...

  5. C# 往Datatable中添加新行的步骤

    以一个实例说明 //录入年份绑定 public void YearList(FineUIPro.DropDownList ddlYear) { //年份从15年到当前年//起止年份 ; int yea ...

  6. [转帖]KMS 是什么 以及 优缺点

    产品激活 比如Windows激活 , office激活 等激活的原理是什么? KMS等激活工具安全吗? http://www.cnblogs.com/flowerslip/p/8370832.html ...

  7. [转帖]你云我云•兄弟夜谈会 第三季 企业IT架构

    你云我云•兄弟夜谈会 第三季 企业IT架构 https://www.cnblogs.com/sammyliu/p/10425252.html 你云我云•兄弟夜谈会 第三季 企业IT架构 你云我云•兄弟 ...

  8. python爬虫scrapy之scrapy终端(Scrapy shell)

    Scrapy终端是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码. 其本意是用来测试提取数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码. ...

  9. HJ212 CRC 16 (C#)

    算法 CRC16 校验寄存器赋值为 0xFFFF: 取被校验串的第一个字节赋值给临时寄存器: 临时寄存器与 CRC16 校验寄存器的高位字节进行"异或"运算,赋值给 CRC16 校 ...

  10. nargin

    nargin 编辑 nargin为“number of input arguments”的缩写. 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数.在matl ...