蓝桥杯二分法例题--跳石头

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本题求最短跳跃距离的最大值,采用二分法解决。在0到总长度间二分枚举最小跳跃距离,通过贪心策略的check函数验证:统计需移除的岩石数是否不超过m。若满足则尝试更大距离,否则减小距离。最终逼近最优解。起点终点岩石不可拆。


题目简介:

解析:题目要求求出最短跳跃的最大值,属于二分法中最小值最大化一类。则在主函数中写出对应的二分算法:长度集合为0-len,mid=(L+R+1)/2,利用二分法不断缩小条件范围。

cin>>len>>n>>m;
for(int i=0;i<n;i++)
{
    cin>>stone[i];
}
int L=0,R=len;
int mid;//二分法找适合的最短距离的最大值 
while(L<R)
{
    mid=(L+R+1)/2;
    if(check(mid))
    L=mid;
    else
    R=mid-1; 
}
cout<<L<<endl;

关于check()函数:check函数用来条件筛选,若符合在至多移走M块岩石的情况,则返回true,说明用于比较的距离d比较小,需要拆掉的岩石少于M,要贪心继续找更大的d,这时候check返回true,主函数内左侧就要缩小至mid。反之说明用于比较的距离d太大了,需要拆掉的岩石多于M,这时候check返回false,主函数内右侧就要缩小至mid-1。

check函数:

bool check(int d)
{
int num=0;
int cur=0;
for(int i=0;i<n;i++)
{
if(stone[i]-cur<d)
num++;
else
cur=stone[i];
}
if(num<=m)
return true;
else
return false;

}

如果stone[i]-cur<d的话需要拆掉stone[i]这块岩石,i++,然后继续看第i+1块岩石需不需要拆掉,否则说明满足d的距离要求了,cur移到这块岩石。

需要注意的是这里起点和终点的岩石是固定的,无法拆除。

完整c++代码:

include

using namespace std;
int stone[1000]={0};
int len;
int n,m;
bool check(int d)
{
int num=0;
int cur=0;
for(int i=0;i<n;i++)
{
if(stone[i]-cur<d)
num++;
else
cur=stone[i];
}
if(num<=m)
return true;
else
return false;

}

int main()
{

cin>>len>>n>>m;
for(int i=0;i<n;i++)
{
    cin>>stone[i];
}
int L=0,R=len;
int mid;//二分法找适合的最短距离的最大值 
while(L<R)
{
    mid=(L+R+1)/2;
    if(check(mid))
    L=mid;
    else
    R=mid-1; 
}
cout<<L<<endl;

return 0;

}

相关文章
|
存储 算法
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
158 0
蓝桥杯:递推 例题:数字三角型问题
蓝桥杯:递推 例题:数字三角型问题
177 0
|
移动开发 Shell
蓝桥杯:2020 国赛 例题:天干地支
蓝桥杯:2020 国赛 例题:天干地支
205 0
蓝桥杯:2019 国赛 例题:求值
蓝桥杯:2019 国赛 例题:求值
176 0
蓝桥杯:桶排序 与 例题:算式问题
蓝桥杯:桶排序 与 例题:算式问题
161 0
蓝桥杯:Map 和 例题:弗里的语言
蓝桥杯:Map 和 例题:弗里的语言
186 0
蓝桥杯:队列 Queue 和 例题: CLZ 的银行
蓝桥杯:队列 Queue 和 例题: CLZ 的银行
193 0
蓝桥杯:vector 与 例题:快递分拣
蓝桥杯:vector 与 例题:快递分拣
149 0
|
机器学习/深度学习
蓝桥杯:栈 和 例题 :小邋遢的衣橱
蓝桥杯:栈 和 例题 :小邋遢的衣橱
249 0
蓝桥杯:2021省赛 例题:直线
蓝桥杯:2021省赛 例题:直线
122 0