二分思想巧换角度解题(在很多答案中,二分查找最终答案)

二分取整直接让条件改成l<=r,不管左右都变mid+/-1即可,然后定义变量ans=mid当函数满足的时候

#include <bits/stdc++.h>
using namespace std;
int len,n,m;
int stone[50001];
bool check(int d)//检查d是否满足条件
{
    int pos=0;//初始化距离
    int num=0;//表示搬走石头数量 
    for(int i=1;i<=n;i++)
    {
        if(stone[i]-pos<d)
        num++;
        else
        pos=stone[i];//换下一块判定
    }
    if(num<=m) return true;
    else return false;
}
int main()
{
    cin>>len>>n>>m;
    for(int i=1;i<=n;i++)
    cin>>stone[i];
    int L=0,r=len,mid;
    while(L<r)//也可以让L=r,然后定义一个变量让ans=mid不变,最后输出ans即可
    {
        mid=(L+r)/2;
        if(check(mid))//满足条件说明mid可能偏小了
        L=mid+1;
        else
        r=mid-1;
    }
    if(!check(L))//要么left符合条件,要么比mid大一
    cout<<L-1;
    else
    cout<<L;
    return 0;
}
全部评论

相关推荐

头像 会员标识
01-14 12:08
门头沟学院 Java
神哥了不得:(非引流)1.既然发出来了简历,就稍微提一点点小建议,确实简历很不错了,练手项目可以换一些质量高的,工作内容,可以加上一些量化指标,比如第一条系统响应速度由多少变成多少,减少了百分之多少,第4条就很不错。2.广投,年前实习招募比较少了
点赞 评论 收藏
分享
03-10 21:11
武汉大学 运营
学不懂的那种:先天考公圣体
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务