二分法试题

洛谷:P1024 一元三次方程求解

二分法试题_第1张图片
代码:

#include
#include
using namespace std;
double a,b,c,d;
int s=0;
double Count(double n)//判断函数,方便简洁。
{
        return a*n*n*n+b*n*n+c*n+d;
}
int main()
{
    cin>>a>>b>>c>>d;
    for(double i=-100;i<100;i++)
    {
        double l=i;
        double r=i+1;
        if(Count(l)==0)//这是当答案是整数的时候,
        {
            printf("%.2lf ",l);
            s++;
        }
        if(Count(r)*Count(l)<0)//这里是判断当函数是小数的时候。
        {
            while(r-l>=0.001)//这里一定要有等于号,这里也一定要是0.001,
            //因为要保存2位小数,因此当差是3位小数的时候,就不需要判断了。
            //这样写就保证了r与l的差值小数点第三位一直是0,
            //因此在最后选结果的时候选r或l都行,因为小数点第三位都是小于4.不影响结果。
            //所以以后这样的二分法,最后选取结果一定要想想怎么写判断循环结束,和怎么选取结果。
            {
                double mid=(r-l)/2+l;
//                if(Count(mid)=0)
//                {
//                    s++;
//                    printf("%.2lf ",mid);
//                }
                if(Count(mid)*Count(l)>0)
                l=mid;
                else
                r=mid;
            }
            printf("%.2lf ",r);
        s++;
        }
        if(s==3)
            break;
    }
    return 0;
}

洛谷:P2678
二分法试题_第2张图片
**思路:**通过二分枚举最短距离,然后再最短距离里面找最大的距离。
代码:

//思路:通过二分枚举最短的距离,然后在这些最短的距离中通过二分推出最大的。
#include
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int s[maxn],n,l,m;
bool judge(int x)
{
    int sum=0,be=0,fe=0;
    while(fe<n+1)//这里面是判断是否要去掉第fe块石头,因此是<,没有=
    {
        fe++;
        if(s[fe]-s[be]<x)
            sum++;
        else
        be=fe;
    }
    return sum<=m;
}
int main()
{
    cin>>l>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>s[i];
    s[n+1]=l;
    int le=1,ri=l;
    while(ri>=le)//要有等于,
    //解释:当到最后一个相邻的ri和le的时候如果没有等于就只判断了le,有了等于才会判断ri。
    //因此要有等于。
    //但是判断ri之后,(因为这是找最大的会向右边走),le会+1,因此最后输出le-1.
    //以后求最大的时候都按照这样的模板写,①ri>=l1②最后结果是l--。
    {
        int mid=(ri-le)/2+le;
        if(judge(mid))
            le=mid+1;
        else
        ri=mid-1;
    }
    cout<<le-1;
    return 0;
}

你可能感兴趣的:(二分法试题)