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中的Init方法, new 方法 call 方法

    new 方法实现单列模式思考 class Single: _single = None _single_only = None def __init__(self, value): self.v = ...

  2. 一些Cassandra+YCSB异常

    这两天一直在用YCSB.昨天还可以用的YCSB,今天在测试Cassandra时遇到问题了. 环境是在公用局域网的一台debian机器,YCSB和Cassandra都在这台机器上.异常是开始运行YCSB ...

  3. rest-framework的认证组件

    认证组件 1.登录认证(与组件无关): 首先要在model表内添加用户表和token表: from django.db import models # Create your models here. ...

  4. echarts使用笔记四:双Y轴

    1.双Y轴显示数量和占比 app.title = '坐标轴刻度与标签对齐'; option = { title : { //标题 x : 'center', y : 5, text : '数量和占比图 ...

  5. 【学习总结】Git学习-参考廖雪峰老师教程十-自定义Git

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  6. 【问题解决方案】之 cmd 窗口问题汇总

    cmd窗口C盘切不到其他盘的解决方案: 1.切换盘符,直接键入其他盘,如:>>D: (回车) 2.强行切换>>cd /d D: 或者 >>pushd C:

  7. asp.net Json序列化

    Json作为一种数据传输格式与标准被广泛的使用在项目开发中,可以说简直离不开它.那么怎么来生成JSON格式的数据就成了我们首先需要解决的问题这里我们使用.net. 首先是获取数据 public ban ...

  8. Ubuntu 12.04 安装socks5代理服务器dante-server

    dante-server是一个很好的socks4/5代理服务器软件. 使用apt-get安装   1 apt-getinstall dante-server 添加一个用户   1 2 useradd ...

  9. ZJU_1145 OR POJ_1100 Dreisam Equations

    Dreisam Equations { 两个网站的题有点不一样(ZJH有特判)POJ时间卡得紧,建议去POJ过 } 题目大意: 给你一个字符串:是一个等式,等式左边是一个数,右边由若干个数和()构成, ...

  10. 莫烦sklearn学习自修第七天【交叉验证】

    1. 什么是交叉验证 所谓交叉验证指的是将样本分为两组,一组为训练样本,一组为测试样本:对于哪些数据分为训练样本,哪些数据分为测试样本,进行多次拆分,每次将整个样本进行不同的拆分,对这些不同的拆分每个 ...