HDU - 5017 Ellipsoid(三分套三分/模拟退火)
题目链接:点击查看
题目大意:给出一个椭球面的方程,求椭球面上的点与原点距离的最小值
题目分析:因为涉及到了求最小值,我们可以考虑三分,又因为每一个点都是三维的(x,y,z),不过z可以通过x和y的计算得出,所以我们可以用三分套三分,一层三分x,一层三分y,每次逼近答案即可,另外这个题目还可以用玄学的模拟退火算法,我没太认真去学,挂个代码吧。。这个题目也是够玄学的,在三分套三分的代码里,inf设的太小跑不出答案,inf设的太大也跑不出答案,设到1e4最佳,虽然跑不出样例,但是却可以AC。。一脸懵逼
代码:
三分套三分:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const double inf=1e4;//玄学infconst int N=5e4+100;const double eps=1e-8;double a,b,c,d,e,f;double cal(double x,double y)//确定x和y后返回的z
{double A=c;double B=d*y+e*x;double C=a*x*x+b*y*y+f*x*y-1;double delta=B*B-4*A*C;if(delta<0)return inf;double z1=(-B+sqrt(delta))/A/2;double z2=(-B-sqrt(delta))/A/2;if(z1*z1<z2*z2)return z1;return z2;
}double dis(double x,double y,double z)
{return sqrt(x*x+y*y+z*z);
}double y(double x)//三分y,返回值为确定x后的距离
{double l=-inf,r=inf;while(fabs(l-r)>eps){double mid=(l+r)/2;//mid代表三分的y double mmid=(mid+r)/2;//mmid代表三分的y if(dis(x,mid,cal(x,mid))<dis(x,mmid,cal(x,mmid)))r=mmid;elsel=mid;}return dis(x,l,cal(x,l));
}double x()//三分x,返回值为答案
{double l=-inf,r=inf;while(fabs(l-r)>eps){double mid=(l+r)/2;//mid代表三分的x double mmid=(mid+r)/2;//mmid代表三分的x if(y(mid)<y(mmid))r=mmid;elsel=mid;}return y(l);
}int main()
{
// freopen("input.txt","r",stdin);while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF){printf("%.8f\n",x());}return 0;
}
模拟退火:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5e4+100;const int pos[8][2]={0,1,0,-1,1,0,-1,0,1,1,-1,-1,1,-1,-1,1};const double eps=1e-8;double a,b,c,d,e,f;double cal(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;double delta=B*B-4*A*C;if(delta<0)return 1e60;double z1=(-B+sqrt(delta))/A/2;double z2=(-B-sqrt(delta))/A/2;if(z1*z1<z2*z2)return z1;return z2;
}double dis(double x,double y,double z)
{return sqrt(x*x+y*y+z*z);
}double SA()
{double step=1;double x=0,y=0,z;double rate=0.99;while(step>eps){z=cal(x,y);for(int i=0;i<8;i++){double xx=x+step*pos[i][0];double yy=y+step*pos[i][1];double zz=cal(xx,yy);if(zz>1e30)continue;if(dis(xx,yy,zz)<dis(x,y,z)){x=xx;y=yy;z=zz;} }step*=rate;}return dis(x,y,z);
}int main()
{
// freopen("input.txt","r",stdin);while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF){printf("%.8f\n",SA());}return 0;
}
HDU - 5017 Ellipsoid(三分套三分/模拟退火)相关推荐
- HDU - 3694 Fermat Point in Quadrangle(三分套三分/凸包)
题目链接:点击查看 题目大意:给出四个点,求出该四边形的费马点,费马点是求得一个点,到这四个点的距离最小,最后输出距离, 题目分析:三分套三分,外层三分x,内层三分y即可,不过就是目前来说遇到的所有三 ...
- 三分的多种写法及对应的精度 三分套三分原理
https://www.luogu.org/problemnew/show/P3382 正规三分法 study from: https://blog.csdn.net/pi9nc/article/de ...
- 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
题目链接:点击查看 题目大意:在二维平面的第一象限中给出两条射线代表河流,再给出起点和终点,问从起点出发,至少经过两条河各一次后到达终点的最短路 题目分析:如果只有一条河的话就是初中数学的经典问题了, ...
- #10017 「一本通 1.2 练习 4」传送带+三分套三分
题目描述 原题来自:SCOI 2010 在一个 2 维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段 AB和线段CD .lxhgww 在 AB上的移动速度为 P ,在 ...
- hdu 5017 Ellipsoid(西安网络赛 1011)
Ellipsoid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- 传送带(三分套三分)
这个毒瘤题 原题链接 题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的 ...
- 【HDU - 5017】Ellipsoid(爬山算法,模拟退火,三分)
题干: Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance between the origina ...
- Ellipsoid HDU - 5017(模拟退火)
Given a 3-dimension ellipsoid(椭球面) your task is to find the minimal distance between the original po ...
- 外卖(food) 洛谷4040宅男计划 三分套二分贪心
food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久. 外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 S ...
最新文章
- 记录我学github的路程(二)
- Struts2使用!动态方法调用无效
- python服务器查看文件更改记录,Python记录到同一文件,不同用户
- 《Getting Real》读书笔记
- USB 设备类协议入门【转】
- java基础---对象锁和类锁的区别
- 【转】C++ 重载、覆盖和隐藏
- Windows 中剪贴板的操作
- 032-OpenCV模板匹配单个对象、多个对象
- View 的 translationX、 translationY , X、Y 和 Left、Top,Right、Bottom
- 现在最火爆的盲盒交友小程序源码
- 病人信息管理html,基于JSP住院病人信息管理系统本科.doc
- 基于滴滴云搭建安全稳定的 Memcached 服务器
- 吐槽一下Win10的输入法管理器
- Leo说说写简历之晋级篇
- 数据挖掘在客户关系管理中的运用
- 搞的跟QQ 新闻一样
- 最牛通达信主升浪精准指标 准确率超高 主图 源码
- 5月底被裁,6月拿到赔偿和工资,下家公司要求提供近半年银行流水来定薪,能不能只提供钱最多的6月流水?...
- SQLServer连接服务器维护,SQLServer远程连接服务器详细配置(sp_addlinkedserver)