对于noi上的题有2种解法:

1.数据很小(N=100),可以直接打for循环枚举和判断。

2.不会“三分”,便用二分。利用“两根相差>=1”和 f(x1)*f(x2)<0,转换意思为[x,x+1]内不会包含两个根,这样枚举可以保证不漏解。因此,枚举一个个根所在的区间,再用二分枚举找出根。其中,若N=10^5,由于保留2位小数,最好精确到4位小数计算。时间复杂度 O(N)=10^5+3*log(10^4),约为10^5。

以下附上二分的代码——

 1 //20160908 Ann
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<iostream>
6 using namespace std;
7 //#include<ctime>
8
9 //eps. epsilon 精确度
10 const double eps=1e-4,INF=1e4;
11 double a,b,c,d;
12
13 double f(double x)
14 { return a*x*x*x+b*x*x+c*x+d; }
15
16 double bisec(double l,double r)
17 {
18 if (f(l)==0) return l;
19 if (f(r)==0) return INF;
20 if (f(l)*f(r)>0) return INF;
21 double m;
22 while (l+eps<r)
23 {
24 m=(l+r)/2;
25 if (f(m)==0) return m;
26 if (f(l)*f(m)<0) r=m-eps;
27 else l=m+eps;
28 }
29 return l;
30 }
31
32 int main()
33 {
34 //freopen("a.in","r",stdin);
35 scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
36 int cnt=0;
37 for(double i=-100.0;i<=100.0;i+=1.0)
38 {
39 double x=bisec(i,i+1.0);
40 if (x!=INF) cnt++,printf("%.2lf ",x);
41 if (cnt==3) break;
42 }
43 //printf("\nTime used = %.2lf\n",(double)clock()/CLOCKS_PER_SEC);
44 return 0;
45 }

最新文章

  1. 网站添加第三方登陆(PHP版)
  2. linux常用系统监控命令
  3. VS2012 提示未找到与约束 ContractName 匹配的倒出
  4. NoSQL 精粹
  5. 菜刀轻松砍杀安全狗 asp一句话中转脚本
  6. [译]Memory Reordering Caught in the Act
  7. 802.11 wireless 四
  8. ↗☻【HTML5秘籍 #BOOK#】第4章 Web表单
  9. JVM内存模型及内存分配过程
  10. js清空页面控件值
  11. C++设计模式之命令模式
  12. 基于存储过程的MVC开源分页控件
  13. 笔记-64位dump转32位dump
  14. app 下载更新 file-downloader 文件下载库的简单介绍和使用
  15. android混淆那些坑
  16. Visual Studio2012 添加服务引用时,生成基于任务操作不可用原因
  17. 20175310 《Java程序设计》第6周学习总结
  18. 关于Android开发中Arm、X86和Mips(草稿)
  19. .net通过url访问服务器获取服务器返回数据
  20. (转)在SDL工程中让SDL_ttf渲染汉字

热门文章

  1. Kali Debian 修改时区
  2. VRay for SketchUp渲染图黑原因及解决方案
  3. 【Vue】Vue框架常用知识点 Vue的模板语法、计算属性与侦听器、条件渲染、列表渲染、Class与Style绑定介绍与基本的用法
  4. iconv函数报错 Detected an illegal character in input string
  5. LSTM+CRF进行序列标注
  6. 2021 Duilib最新入门教程(一)Duilib简介
  7. 1.5V升5V芯片,1.5V升5V电路图规格书
  8. websocket的应用---Django
  9. vue+element-ui:table表格中的slot 、formatter属性
  10. TCP服务器程序