zoukankan      html  css  js  c++  java
  • P3382 【模板】三分法

    题目链接

    强烈建议跟二分法计算函数零点的这道题目做对比。

    题目描述

    如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。

    输入输出格式

    输入格式:

    第一行一次包含一个正整数N和两个实数l、r,含义如题目描述所示。

    第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数。

    输出格式:

    输出为一行,包含一个实数,即为x的值。四舍五入保留5位小数。

    输入输出样例

    输入样例#1:

    3 -0.9981 0.5
    1 -3 -3 1

    输出样例#1:

    -0.41421

    说明

    时空限制:50ms,128M

    数据规模:

    对于100%的数据:7<=N<=13

    样例说明:

    如图所示,红色段即为该函数f(x)=x^3-3x^2-3x+1在区间[-0.9981,0.5]上的图像。

    当x=-0.41421时图像位于最高点,故此时函数在[l,x]上单调增,[x,r]上单调减,故x=-0.41421,输出-0.41421。

    (Tip.l&r的范围并不是非常大ww不会超过一位数)

    算法分析

    如题所述,就是用三分算法直接套模板即可。

    所谓三分算法我是在曹文老师的《信息学奥赛一本通·提高篇》分治算法章节首次接触。原文如下图所示。

    下面是本题的AC代码:

     1 #include<stdio.h>
     2 #include<math.h>
     3 int N;
     4 double a[20];
     5 double f(double x)
     6 {
     7     double res=0;
     8     int i;
     9     for(i=N;i>=0;i--) res=res+a[i]*pow(x,i);
    10     return res;
    11 }
    12 int main()
    13 {
    14     freopen("p3382.in","r",stdin);
    15     int i;
    16     double L,R,m1,m2;
    17     double t1,t2;
    18     scanf("%d%lf%lf",&N,&L,&R);
    19     for(i=N;i>=0;i--) scanf("%lf",&a[i]);
    20     while(L+1e-6<R)
    21     {
    22         m1=L+(R-L)/3; m2=R-(R-L)/3;
    23         t1=f(m1);  t2=f(m2);
    24         if(t1<t2) L=m1;
    25         else R=m2;
    26     }
    27     printf("%.5lf",L);
    28     return 0;
    29 }
  • 相关阅读:
    android kl文件
    ELF文件结构描述
    jquery开头
    win7无声音显示“未插入扬声器或耳机” 怎么解决
    xhtml头文件设置
    break和continue的区别
    php目录函数
    mysql语法
    php中怎么导入自己写的类
    截取文件后缀名
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/10960681.html
Copyright © 2011-2022 走看看