当前位置: 首页 > news >正文

跳石板_牛客网

链接:https://www.nowcoder.com/questionTerminal/4284c8f466814870bae7799a07d49ec8
来源:牛客网

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
输入描述: 输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)
输出描述: 输出小易最少需要跳跃的步数,如果不能到达输出-1

思路:

  1. res数组中存储着从起点到index位置所需最小步数(每部步长均为该步起点的约数),默认均为不可达(INT_MAX);
  2. 从起点(i = N)开始遍历,如果当前位置不可达,直接进入下一次循环,表示该位置不可用;
  3. 否则,计算从位置i走,可选的步长有哪些(vector v),遍历v,更新从位置i走一步(步长为it)可到达的位置的res数组对应值,即从起点到位置i+it的当前最少步数。(分位置i+it原本可达和不可达两种情况,详细论述见代码中注释)
  4. 最终,res数组中存储着从位置N到[N~M]间每个位置的最少步数的确定值
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;

void func(int x, vector<int>& v) //求x除1和其本身的约数
{
    int ret = 0;
    for(int i = 2; i*i <= x; ++i)
    {
        if(x % i == 0)
        {
            v.push_back(i);
            if(x / i != i)
                v.push_back(x / i);
        }
    }
}

int main()
{
    int N, M;
    while(cin >> N && cin >> M)
    {
        vector<int> res(M+1, INT_MAX); //记录从N到该位置(cur_index)所需步数,INT_MAX为不可达,初始值为INT_MAX
        res[N] = 0; 
        for(int i = N; i < M; ++i)
        {
            if(res[i] == INT_MAX)
                continue;
            //以下,位置i可达
            vector<int> v; 
            func(i, v); //v中为i的约数,即从位置i走,可选的步长
            for(const auto it : v)
            {
                if(i + it <= M) 
                    //从位置i走it步,不超出终点M;
                    res[i+it] = min(res[i+it], res[i]+1); 
                    //1.位置i+it原本可到达,更新为较小的
                    //从位置i走,一次it步长可到达位置i+it,
                    //即从N到达位置i+it,所以一个可选方案是走ret[i]+1步,与原本的值保留较小的
                    //2.位置i+it本不可达,现在已知从位置i走一次步长为it可到达该位置,因此更新为ret[i]+1
            }
        }
        if(res[M] == INT_MAX) //每次步长为约数,不可达
            cout << -1 << endl;
        else                  //可达
            cout << res[M] << endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/dabai56/p/10971184.html

相关文章:

  • Google浏览器插件
  • 第二阶段冲刺4
  • python篇第10天【For 循环语句】
  • React实战之将数据库返回的时间转换为几分钟前、几小时前、几天前的形式。...
  • 2、CDH组件安装
  • 第一章 Vue介绍
  • awk使用记录
  • (¥1011)-(一千零一拾一元整)输出
  • 第六章 组件 51 组件化和模块化的区别
  • 如何回答——请简述MySQL索引类型
  • WUSTOJ 1307: 校门外的树(Java)
  • 【java】查重类的实现
  • 解决Visual Studio 2017隐藏“高级保存选项”命令
  • 深入理解HashMap(JDK1.8)
  • install web3 1.0
  • (三)从jvm层面了解线程的启动和停止
  • 5、React组件事件详解
  • ESLint简单操作
  • extract-text-webpack-plugin用法
  • Linux链接文件
  • Logstash 参考指南(目录)
  • magento 货币换算
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • rc-form之最单纯情况
  • Redis 中的布隆过滤器
  • vue-loader 源码解析系列之 selector
  • Vultr 教程目录
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 两列自适应布局方案整理
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 少走弯路,给Java 1~5 年程序员的建议
  • 用简单代码看卷积组块发展
  • No resource identifier found for attribute,RxJava之zip操作符
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 阿里云ACE认证学习知识点梳理
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (小白学Java)Java简介和基本配置
  • (转)大道至简,职场上做人做事做管理
  • (转)重识new
  • (转载)Google Chrome调试JS
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET导入Excel数据
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET是什么
  • :中兴通讯为何成功
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解