• LOJ P10013 曲线 题解


    每日一题 day38 打卡

    Analysis

    这道题运用的是三分,就是说具有一定的单调性,找最大最小值,然后和二分基本类似,就是说特性就是说当前两个点比较,较优的点和最优点在相对了较差点的同侧,就是说那边差就把范围定到那里去

    注意:要注意精度问题,一般定到1e-9或1e-11

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define int long long
     6 #define maxn 100000+10
     7 #define INF 0x7fffffff
     8 #define rep(i,s,e) for(register int i=s;i<=e;++i)
     9 using namespace std;
    10 inline int read()
    11 {
    12     int x=0;
    13     bool f=1;
    14     char c=getchar();
    15     for(; !isdigit(c); c=getchar()) if(c=='-') f=0;
    16     for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+c-'0';
    17     if(f) return x;
    18     return 0-x;
    19 }
    20 int T,n;
    21 struct node
    22 {
    23     double a,b,c;
    24 }x[maxn];
    25 inline double max(double x,double y)
    26 {
    27     if(x>=y) return x;
    28     return y;
    29 }
    30 inline double calc(double xx)
    31 {
    32     double res=-INF;
    33     rep(i,1,n)
    34         res=max(res,x[i].a*xx*xx+x[i].b*xx+x[i].c);
    35     return res;
    36 }
    37 signed main()
    38 {
    39     T=read();
    40     while(T--)
    41     {
    42         memset(x,0,sizeof(x));
    43         n=read();
    44         rep(i,1,n) x[i].a=read(),x[i].b=read(),x[i].c=read();
    45         double l=0.0,r=1000.0;
    46         while(r-l>=1e-11)
    47         {
    48             double lmid=l+(r-l)/3,rmid=r-(r-l)/3;
    49             if(calc(lmid)<=calc(rmid)) r=rmid;
    50             else if(calc(lmid)>calc(rmid)) l=lmid; 
    51         }
    52         printf("%.4lf
    ",calc(l));
    53     }
    54     return 0;
    55 }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    窗体传值的方式
    多线程的两种启动方式的简单总结
    ExcelHelper
    从Excel读取信息,新建文件夹,根据起始页号和页数取图片,并将图片重命名
    自定义函数
    从sql数据库中将图片导出并重命名
    统计重复出现的次数
    创建S数据库表SQL语句
    C#执行sql文件 运行sql文件
    ssh整合常见的后台错误
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11844374.html
Copyright © 2020-2023  润新知