Line belt HDU
来源:互联网 发布:网络信息群发软件 编辑:程序博客网 时间:2024/06/04 00:19
原题:HDU- 3400
三分搜索用来找中间最优点,设变量l、r、mid=(l+r)/2、mmid=(mid+r)/2;一步步向最优值逼近,适用于二次函数模型
这个题以找AB的最优点来寻找CD的最优点,用两个三分搜索
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>using namespace std;double Ax,Ay,Bx,By,Cx,Cy,Dx,Dy;double p,q,r;double f4(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}double f3(double xie,double x1,double y1) { double x=Cx+(Dx-Cx)*xie; double y=Cy+(Dy-Cy)*xie; return f4(x,y,x1,y1)/r+f4(x,y,Dx,Dy)/q;}double f2(double xie) { double x=Ax+(Bx-Ax)*xie; double y=Ay+(By-Ay)*xie; double l=0.0,r=1.0,mid,mmid,t1,t2; while(r-l>1e-8) { mid=(r+l)/2; mmid=(mid+r)/2; t1=f3(mid,x,y); t2=f3(mmid,x,y); if(t1<t2) r=mmid; else if(t1>t2) l=mid; else break; } return t1+f4(x,y,Ax,Ay)/p;}double f1() { double l=0.0,r=1.0,mid,mmid,t1,t2; while(r-l>1e-8) { mid=(r+l)/2; mmid=(mid+r)/2; t1=f2(mid); t2=f2(mmid); if(t1<t2) r=mmid; else if(t1>t2) l=mid; else break; } return t1;}int main() { int T; scanf("%d",&T); while(T--) { scanf("%lf %lf %lf %lf",&Ax,&Ay,&Bx,&By); scanf("%lf %lf %lf %lf",&Cx,&Cy,&Dx,&Dy); scanf("%lf %lf %lf",&p,&q,&r); printf("%.2f\n",f1()); } return 0;}
0 0
- HDU 3400 Line belt
- HDU Line belt
- HDU 3400 Line belt
- hdu 3400 Line belt
- HDU 3400 Line belt
- hdu 3400 Line belt
- hdu 3400 Line belt
- HDU 3400 Line belt
- HDU 3700 Line belt
- HDU 3400 Line belt
- HDU 3400 Line belt
- Line belt HDU
- hdu 3400 Line belt
- Line belt HDU
- HDU 3400 Line belt 三分
- HDU OJ 3400 Line belt
- HDU 3400 Line belt (三分法)
- hdu 3400Line belt(三分法)
- ubuntu16.04下安装搜狗输入法
- linux之chdir解析
- Swift 系统学习 30 枚举 结构体 类 遵循协议 protocol
- iBET Poker Card Lucky Draw
- CString和LPCSTR区别
- Line belt HDU
- git学习笔记
- 喵哈哈村的种花魔法
- 如何快速启用或者禁用本地连接
- 基础理论知识复习(下)
- oracle keep函数
- ORACLE 解决ORA-28000: the account is locked
- WEKA使用教程(经典教程转载)
- Swift 系统学习 31 扩展 extension