IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 18725 宇宙迁跃(二分算法) -> 正文阅读

[数据结构与算法]18725 宇宙迁跃(二分算法)

二分算法是分治算法的一种,注意分治算法有很多子类,比如:折半查找、二分算法,三分算法、分形问题等,第八章的很多排序算法也属于分治算法。

二分算法是把问题"解空间"一分为二的算法。它要求答案可以通过枚举的方式解决,同时解空间具有单调性,比如本题目飞船的跳跃能力,如果X能力可以成功,那么X+1、X+2......都可以成功,这就是单调性。
解题方法是先设定解空间的范围,比如本题目飞船的能力区间可以设定为[0,a[n]],显然飞船如果具备一次跳到终点a[n]的能力,那么它一定能完成任务。

算法模板:
定义当前解区间为[L,R],求出中点mid,无论mid是否满足条件,都要根据题意决定下一次区间范围,直到区间长度小于1位置。最后best(备胎)中存储的是满足条件的极值。
int L=0,R=2e9,mid,best=0;
while(L<=R)/**< */
{
? ? mid=(L+R)/2;
? ? if(check(mid))
? ? ? ? ? best=mid,R=mid-1;
? ? else
? ? ? ? ? L=mid+1;
}
cout<<best<<endl;

本题目唯一难点就是如何判断k天能否到达,此处使用了双指针法,pre和和i同步前进。细节写在代码注释中,读者根据代码自行研读。

#include <iostream>
using namespace std;
int n,m,key,a[100005];
bool check(int x)/**< 跳能力是x,跳几次? */
{ /**< 双指针表示跳跃行为,计算后,跳跃的起点pre,跳跃终点i-1 */
    int pre=0,c=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]-a[i-1]>x)
            return false;
        if(a[i]-pre>x)
        { /**< 最多能跳到i-1,跳到i就超过能力x了,pre--->i-1 */
            pre=a[i-1];
            c++;
            i--;
        }
    }
    c++;/**< 最后加一次是因为上面循环跳到a[n]时没有计算次数 */
    return c<=m;
}
int main()
{
    int i,j,q;
    cin>>n>>m;
    for(i=1; i<=n; i++)
        cin>>a[i];
    int L=1,R=2E9,mid,best=0;
    while(L<=R)/**<当区间不为空时 */
    {
        mid=(L+R)/2;
        if(check(mid)) /**< 如果中点满足条件,先记录这个值,然后将区间缩小为[L,mid-1] */
            best=mid,R=mid-1;
        else
            L=mid+1; /**< 中点不满足条件,这个值显然不够大,区间缩小为[mid+1,R] */
    }
    cout<<best<<endl;
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:31:56  更:2022-04-27 11:34:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:41:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码