zoukankan      html  css  js  c++  java
  • 三分·三分求极值

    三分求极值
    时间限制: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
    #include <iostream>
    #include <math.h>
    #include <float.h>
    #include <iomanip>
    using namespace std;
    double presult = 0.0;
    typedef struct funcparamter
    {
        double a;
        double b;
        double c;
    } funcparamter;
    
    typedef struct point
    {
        double x;
        double y;
    } point;
    
    double Calculator(funcparamter minefunc,point knownpoint,point foundpoint)
    {
        return sqrt((foundpoint.x-knownpoint.x)*(foundpoint.x-knownpoint.x)+(minefunc.a*pow(foundpoint.x,2)+minefunc.b*foundpoint.x+minefunc.c-knownpoint.y)*(minefunc.a*pow(foundpoint.x,2)+minefunc.b*foundpoint.x+minefunc.c-knownpoint.y));
    }
    double findY(double x,funcparamter minefunc)
    {
        return minefunc.a*pow(x,2)+minefunc.b*x+minefunc.c;
    }
    
    double findmin(double left,double right,funcparamter minefunc,point knownpoint)
    {
        point lm,rm;
        lm.x = left+(right-left)/3;
        rm.x = left+2*(right-left)/3;
        lm.y = findY(lm.x,minefunc);
        rm.y = findY(rm.x,minefunc);
    
    
        if((Calculator(minefunc,knownpoint,lm)-Calculator(minefunc,knownpoint,rm))==0)
        {
            double min = Calculator(minefunc,knownpoint,lm)<Calculator(minefunc,knownpoint,rm) ?  Calculator(minefunc,knownpoint,lm) : Calculator(minefunc,knownpoint,rm);
            cout<<setiosflags(ios::fixed)<<setprecision(3)<<min<<endl;
            return min;
        }
        else if(Calculator(minefunc,knownpoint,lm)<Calculator(minefunc,knownpoint,rm))
        {
            findmin(left,rm.x,minefunc,knownpoint);
        }
        else
        {
            findmin(lm.x,right,minefunc,knownpoint);
        }
    }
    int main()
    {
        funcparamter minefunc;
        point knownpoint;
    
        //cout<<DBL_MAX<<endl;
        cin>>minefunc.a>>minefunc.b>>minefunc.c>>knownpoint.x>>knownpoint.y;
        //cout<<Calculator(minefunc,knownpoint,foundpoint)<<endl;
        findmin(-10000,10000,minefunc,knownpoint);
        return 0;
    }
    

    提示

    这是最佳的代码:
    #include <iostream>
    #include <stdio.h>
    #include <math.h>
    #define N 400
    using namespace std;
    int main(void)
    {
    	float a,b,c,x,y;
    	float X;
    	float fx,d,mindis;
    	scanf("%f%f%f%f%f",&a,&b,&c,&x,&y);
    	X=-N;
    	mindis=sqrt((X-x)*(X-x)+(fx-y)*(fx-y));
    	for(;X<=N;X=X+0.0001)
    	{
    		fx=a*X*X+b*X+c;
    		d=sqrt((X-x)*(X-x)+(fx-y)*(fx-y));
    		if(d<mindis) mindis=d;
    	}
    	printf("%5.3f
    ",mindis);
    	return 0;
    }
    

      

    态度决定高度,细节决定成败,
  • 相关阅读:
    二叉链表(双叉链表)实现二叉树
    队列知识
    windows下Anaconda3配置TensorFlow深度学习库
    栈的顺序结构和链式结构实现
    Anaconda中配置Pyspark的Spark开发环境
    Scala学习笔记(3)-表达式归纳
    SparkR-Install
    推荐系统之最小二乘法ALS的Spark实现
    linux查看主机端口进程命令
    使用redis的五个注意事项
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/4398836.html
Copyright © 2011-2022 走看看