二分答案经典入门题:)

Posted thwzf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分答案经典入门题:)相关的知识,希望对你有一定的参考价值。

LuoguP1024  一元三次方程求解

题目传送门

因为根与根之间的差不超过1,所以我们就可以分段枚举,又已知根的取值范围是[-100,100],于是就很简单啦QWQ

xiu~代码走起——

 1 #include<cstdio>
 2 double a,b,c,d;
 3 double count(double x){//计算函数值
 4     return a*x*x*x+b*x*x+c*x+d;
 5 }
 6 int main(){
 7     double l,r,mid,x1,x2;
 8     int tot=0,i;
 9     scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
10     for (i=-100;i<100;i++){
11         l=i; 
12         r=i+1;//两根之间差值不超过1
13         x1=count(l); 
14         x2=count(r);
15         if(x1==0){
16             printf("%.2lf ",l); 
17             tot++;//记录根的数量,总共3个
18         }
19         if(x1*x2<0){
20             while(r-l>=0.001){//实数比较,相当于r>=l
21                 mid=(l+r)/2;
22                 if(count(mid)*count(r)<=0) 
23                    l=mid; 
24                 else 
25                    r=mid; 
26             }
27             printf("%.2lf ",r);
28             tot++;
29         }
30         if (tot==3) 
31             break;
32     }
33     return 0;
34 }

LuoguP2678  跳石头

题目传送门

一看到求最小的最大就知道这是二分答案经典题。

直接二分枚举答案也就是最短跳跃距离,然后判断需要挪走的石头数量是否合法,恩就酱紫直接上代码吧

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int l,n,m,d[50002];
 4 int fr(){
 5     int w=0,q=1;
 6     char ch=getchar();
 7     while((ch<0||ch>9)&&ch!=-) ch=getchar();
 8     if(ch==-) q=-1;
 9     while(ch<=9&&ch>=0) w=w*10+ch-0,ch=getchar();
10     return w*q;
11 }
12 int maxn=0;
13 bool pd(int x){
14     int now=0,num=0,next=0;
15     while(next<n+1){
16         next++;
17         if(d[next]-d[now]<x)
18             num++;
19         else now=next;
20     }
21     if(num>m) return 0;//需要移走的石头数量>最多可以移走的石头数量则显然不合法
22     else return 1;
23 }
24 int main(){
25     l=fr();n=fr();m=fr();
26     for(int i=1;i<=n;i++)
27         d[i]=fr();
28     d[n+1]=l;//注意第n+1块石头的距离才是l
29     int L=1,R=l;//注意一下左右端点的初始值,要符合题目的要求
30     while(L<=R){
31         int mid=(L+R)/2;
32         if(pd(mid)){
33             L=mid+1;
34             maxn=mid;//记录最大的答案
35         }
36         else R=mid-1;
37     }
38     printf("%d",maxn);
39     return 0;
40 }

 


以上是关于二分答案经典入门题:)的主要内容,如果未能解决你的问题,请参考以下文章

数列分段II

一道经典面试题:字符串在Java中如何通过“引用”传递

动态规划入门——在转移的时候使用二分法加速查找

[经典面试题]二分查找问题汇总

整体二分总结

AK leetcode 流浪计划 - 二分查找