这里是比赛地址:http://tieba.baidu.com/p/2859693237,果然参赛神牛汇集。

第三题题目大意如下:

已知n条二次函数曲线Si(x)=aix^2+bix+ci(ai>=0),定义F(x)=max{Si(x)},求出F(x)在[0,1000]上的最小值。第一行为数据组数T。每组数据第一行位正整数n,以下n行每行包括3个整数a,b,c。对于每组数据,输出所要求的最小值,保留4位小数。T<
10, n ≤ 10000,0 ≤ a ≤ 100,|b| ≤ 5000, |c| ≤
5000。

有点像数学+二分,开始我想二分x的,但发现函数众多,线索混乱,觉得这会有问题。

后来这道题经RXD大牛点拨,我有了一个绝妙的想法 :二分枚举答案f(x),并验证。比如,我们枚举的答案当前是k,那么我们在坐标系里划一道y=k的图像,这与n条函数图像可能会有交点。因
F(x)=max{Si(x)},,所以在【0...1000】范围内,y=k一定在最上面。设某一二次函数解析式y=ax^2+bx+c,它与直线的交点为方程ax^2+bx+c=k的根(因为0≤
a
 ,所以如果b^2-4*a*c<0,说明函数在直线上方,可以直接否决当前的K),而它在直线的下方的部分可以用x1<x<x2来表示(x1和x2是方程的根)。如果对于所有的函数,其在直线下方的解集存在于【0..1000】范围内(无论多少),说明当前的K是可行的。

时间效率:O(log2(P)*n)),其中p是你答案枚举的范围。(最好设的大一点) 

然而,我交上去后,发现全WA了!! 后来经过我对数据的不断调试,发现如下两个问题。

(1)二分答案时如何确定边界。保留4位精度嘛,我原先用ok函数来判断。如果ok(l)=ok(r),就退出。

long ok(double k)
{
  if (long(k*100000)%10>4) return(long(k*10000+1));
  return (long(k*10000));
}

即如果枚举的l和r小数点后四位相同,就退出。

但是这会有问题 ,比如l=0.999,并无限接近1;r=1.001,也无限接近1。这样,即使二分到很后面,如l=0.99999999,r=1.00000001,他们的后四位仍然不同。

后来我发现一个更简单的判断方法,即(r-l<=0.00001 (5位)) 

(2)a可能为0,即某一函数可能不是二次函数,而是一次函数。

因为在求根公式中,a被当做了除数,这样除0的话就会爆掉。因此,对于一次函数,要简单处理一下(其实更容易)



以下附代码:

#include<stdio.h>
#include<cmath>
using namespace std;
long a[10001],b[10001],c[10001],i,j,t,n,oo=2000000000;                           //oo被视为无限大
double ans;
bool check(double h)
{
  long i;double x1,x2,t,start1=0,start2=1000,p;
  for (i=1;i<=n;i++)
  {
    p=b[i]*b[i]-4*a[i]*(c[i]-h);
    if (p<0) returnfalse;p=sqrt(p);
    if (a[i]==0)
    {
      if(b[i]>0){x1=-oo;x2=(h-c[i])/b[i];}
      else if(b[i]<0){x1=(h-c[i])/b[i];x2=oo;}
      else if (c[i]>h) return false;
      else { x1=-oo;x2=oo;}
    }
    else
    {
      x1=(-b[i]-p)/a[i]/2;
      x2=(-b[i]+p)/a[i]/2;
    }
    if (start2<x1||x2<start1) returnfalse;
    if (x1>start1) start1=x1;if (x2<start2)start2=x2;
  }
  return true;
}
double erfen(double l,double r)
{
  double mid=(l+r)/2;
  if ((r-l)<=1e-5) return mid;
  if (check(mid)) return erfen(l,mid);
  return erfen(mid,r);
}
int main()
{
  freopen("pyc.in","r",stdin);
  freopen("pyc.out","w",stdout);
  scanf("%ld",&t);
  for (j=1;j<=t;j++)
  {
    scanf("%ld",&n);
    for (i=1;i<=n;i++)
     scanf("%ld%ld%ld",&a[i],&b[i],&c[i]);
    ans=erfen(0,10000);                         //当然再开大一点也可以,只是不要超时了
    printf("%.4f\n",ans);
  }
}

最后提出一个意见,第10组数据中出现了a<0,使我的程序出错,请PYC及时纠正。O(∩_∩)O~~

PYC#1欢乐赛第三题题解的更多相关文章

  1. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  2. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  3. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  4. BestCoder Round #86 二,三题题解(尺取法)

    第一题太水,跳过了. NanoApe Loves Sequence题目描述:退役狗 NanoApe 滚回去学文化课啦! 在数学课上,NanoApe 心痒痒又玩起了数列.他在纸上随便写了一个长度为 nn ...

  5. BestCoder Round #85 前三题题解

    sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  6. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  7. Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)

    题目/题解戳这里 这道题题目保证a,b,ca,b,ca,b,c各是一个排列-mdzz考场上想到正解但是没看到是排列,相等的情况想了半天-然后写了暴力60分走人- 由于两两间关系一定,那么就是一个竞赛图 ...

  8. Codeforces Round #530 (Div. 2) (前三题题解)

    总评 今天是个上分的好日子,可惜12:30修仙场并没有打... A. Snowball(小模拟) 我上来还以为直接能O(1)算出来没想到还能小于等于0的时候变成0,那么只能小模拟了.从最高的地方进行高 ...

  9. BestCoder Round #11 (Div. 2) 前三题题解

    题目链接: huangjing hdu5054 Alice and Bob 思路: 就是(x,y)在两个參考系中的表示演全然一样.那么仅仅可能在这个矩形的中点.. 题目: Alice and Bob ...

随机推荐

  1. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  2. 前端教你学UI——人物处理(一)

    一.序言 本文作为本系列的第一篇写UI的文章,开头还是有必要申明一些东西的,本系列主要是为了作为博主在前端工作之余学习UI的一个记录,同时为了让更多的同行学习到一些编程之外的其他东西.所以本文会尽可能 ...

  3. crontab表达式执行时间计算,crontab在线测试

    熟悉Unix和Linux的朋友都知道Crontab表达式,通过crontab指令可以周期性调用或执行某个程序.   但是大家写完crontab表达式后,心里总是担心表达式写的不对,可以又没法去验证.比 ...

  4. 关于用css实现文本和图片垂直水平居中

    关于用css实现文本和图片垂直水平居中   一直相信好记性不如烂笔头,最近遇到很多用到垂直居中的,整理一下以便日后查阅. 一.文本垂直水平居中 1.水平居中: 文字水平居中没什么好说的,用text-a ...

  5. Java经典编程题50道之二十

    有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. public class Example20 {    public static void ma ...

  6. css样式,边界和边框,格式和布局

    1.大小:width:宽:heigh:高 2.背景:1)background-color:背景颜色 2)background-image:背景图片url路径 3)background-repeat:图 ...

  7. nginx四层负载均衡配置

    nginx四层负载均衡配置代理Mysql集群 环境如下: ip 192.168.6.203 Nginx ip 192.168.6.*(多台) Mysql 步骤一 查看Nginx是否安装stream模块 ...

  8. JavaScript数组基础及实例

    js数组 和var i=1;这样的简单存储一样是js中的一种数据结构,是专门用来存储多个数据的一种数据结构. 摘:数组是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内 ...

  9. 浏览器未安装flash插件,js判断直接去官网安装

    近期做了个活动页,里面根据需求插入了阿里云的视频,常见的浏览器都支持包括低版本的. 由于浏览器的更新换代很多版本放弃了flash的插件安装,火狐就是其中之一. 未安装flash的浏览器如果打开这个链接 ...

  10. Java IO学习笔记六

    打印流 在整个IO包中,打印流是输出信息最方便的类,主要包含字节打印流(PrintStream)和字符打印流(PrintWrite).打印流提供了非常方便的打印功能,可以打印任何的数据类型,例如:小数 ...