hihocoder 1142 三分求极值【三分算法 模板应用】
2015-07-21 16:17
471 查看
#1142 : 三分·三分求极值
时间限制:10000ms单点时限:1000ms
内存限制:256MB
描述
这一次我们就简单一点了,题目在此:在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。
提示:三分法
输入
第1行:5个整数a,b,c,x,y。前三个数构成抛物线的参数,后两个数x,y表示P点坐标。-200≤a,b,c,x,y≤200输出
第1行:1个实数d,保留3位小数(四舍五入)样例输入
2 8 2 -2 6
样例输出
2.437 算法分析:给你一条凸性曲线,给你一点p(x,y),让你计算这条曲线上的某点到这个p点的最近距离。 采用三分算法,思路:我们将最大区间定为[left, right],我们不断的三分枚举这个区间,直到 最小。 首先将区间三分:mid=(left+right)/2; midmid=(mid+right)/2;(并非是严格的三) 等分。我们比较calc(mid)与 calc(midmid)的值,来判断接下来的区间逼近过程该向哪个区间逼近。 代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <iostream> #include <string> #include <queue> #include <stack> #include <algorithm> #define N 100000+100 #define M 60000+100 #define INF 0x3f3f3f3f #define eps 1e-8 using namespace std; int a, b, c, x, y; double calc(double x) { return a*x*x+b*x+c; } //获取函数的y值 double dist(double dd) { return (dd-x)*(dd-x)+(calc(dd)-y)*(calc(dd)-y); } //获取函数曲线上的点到线外一点的距离 void Three_search() { double left, right; double mid, midmid; double mid_value, midmid_value; left=-200.0; right=200; while(left+eps<right) { mid = (left+right)/2; mid_value=dist(mid); midmid=(mid+right)/2; midmid_value=dist(midmid); if(mid_value>=midmid_value ) { left=mid; //区间逼近 }else{ right=midmid;//区间逼近 } } double ans=dist(left); //此时的left与right已经逼近到值几乎相同了 ans = sqrt(ans); printf("%.3lf\n", ans ); } int main() { scanf("%d %d %d %d %d", &a, &b, &c, &x, &y); Three_search(); return 0; }
相关文章推荐
- 内存溢出之Tomcat内存配置
- 行人检测最新论文简介
- LEAR's main research areas are:
- css默认值汇总
- jsp和jspf的关系
- 文件操作
- 支付宝扫描二维码登录网站
- mybatis springmvc调用oracle存储过程,返回记录集
- CSS中float的用法
- 优高胜O2O模式
- java实现单链表之逆序
- 请千万当心:警惕云使用过程中的分析瘫痪问题
- GCD 深入理解(一)
- 一小时了解数据挖掘⑥数据挖掘的评估和结果可视化展示
- 剑指off-求二叉树高
- [随 笔]iOS提醒笔记
- 安卓IDE下载
- selemium 官网打不开怎么办
- oracle 数据库创建表空间和用户
- 聊聊高并发(四十三)解析java.util.concurrent各个组件(十九) 任务的定时执行和周期执行