[每日习题]跳石板(动态规划) 手套(贪心)——牛客习题

news2024/11/16 2:47:19

hello,大家好,这里是bang___bang_,今天来记录2道习题跳石板和手套!

目录

1️⃣跳石板

2️⃣手套


1️⃣跳石板

跳石板_牛客题霸_牛客网 (nowcoder.com)

描述

小易来到了一条石板路前,每块石板上从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

 示例:

输入:4 24

输出:5

解题思路: 

多种解中找最优解,动态规划!分解规模!前面小规模的答案能被后面的问题利用!

从当前石板开始模拟跳跃,求解约数,跳约数距离至对应石板,更新为最小步数。

模拟跳跃过程:如果当前石板无法通过前一个石板跳到(标记INT_MAX,表示不可达),直接越过这个石板(continue)往后寻找前一个石板可以跳至的石板。前一个跳至的石板决定跳至当前石板的步数!

转移方程:

step[res[j]+i]=min(step[i]+1,step[res[j]+i])    //i为石板编号,res[j]为i的约数
step[n]=0

实现代码:

#include<iostream>
#include<limits.h>
#include<vector>
#include<cmath>
using namespace std;

void get_div_num(int n,vector<int>& res)
{
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            res.push_back(i);
            if(n/i!=i)
            {
                res.push_back(n/i);
            }
        }
    }
}

int Jump(int n,int m)
{
    //存对应石板的跳跃步数
    vector<int> step(m+1,INT_MAX);//下标从0开始多开1个保持和石板编号一一对应
    step[n]=0;//开始石板不需要跳,值为0
    //从编号为n的石板开始跳
    for(int i=n;i<m;i++)
    {   
        //如果当前石板存值为INT_MAX表示该石板跳不到
        if(step[i]==INT_MAX)
        {
            continue;
        }
        //当前石板可到达,求解往后跳的约数
        vector<int>res;
        //获取约数
        get_div_num(i,res);
        for(int j=0;j<res.size();j++)
        {
            //之前已有跳跃数,更新挑选该石板的最少跳跃数
            if(res[j]+i<=m&&step[res[j]+i]!=INT_MAX)
            {
                step[res[j]+i]=min(step[i]+1,step[res[j]+i]);
            }
            //之前没有跳跃数,跳跃数+1
            else if(res[j]+i<=m)
            {
                step[res[j]+i]=step[i]+1;
            }
        }
    }
    return step[m]==INT_MAX?-1:step[m];
}


int main() {
    int n,m,min_step;
    while(cin>>n>>m)
    {
        min_step=Jump(n,m);
        cout<<min_step<<endl;
    }
    return 0;
}

2️⃣手套

手套_牛客题霸_牛客网 (nowcoder.com)

描述

        在地下室里放着n种颜色的手套,手套分左右手,但是每种颜色的左右手手套个数不一定相同。A先生现在要出门,所以他要去地下室选手套。但是昏暗的灯光让他无法分辨手套的颜色,只能分辨出左右手。所以他会多拿一些手套,然后选出一双颜色相同的左右手手套。现在的问题是,他至少要拿多少只手套(左手加右手),才能保证一定能选出一双颜色相同的手套。

        给定颜色种数n(1≤n≤13),同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。数据保证左右的手套总数均不超过26,且一定存在至少一种合法方案。

测试样例:

4,[0,7,1,6],[1,5,0,6]

返回:10

解题思路: 

        这个题目说至少拿多少只手套,那我们要保证把没有颜色匹配的拿出来(即左边有,右边没有;或者左边没有,右边有)并且我们还要保证使一边手套的每种都拿出来至少一只(选出需要拿的数量最少的一边),然后再从另一边拿1只就可以得到至少拿的数量。

🌰[0,7,1,6] [1,5,0,6]

假设从左往右是:红 蓝 黄 绿 (方便我描述)

1.红和黄是颜色无法匹配的!先拿出来!(也就是0+1+1+0=2)

2.拿出无法匹配的后,其实变成了[7,6] [5,6]

3.使一边手套的每种至少都拿出来1只,也就是sum-min+1。

左边:7+6-6+1=8(最少拿8只才能保证每种都取了一只)

右边 :5+6-5+1=7(最少拿7只才能保证每种都取了一只)

4.选取小的一边右边(也就是7)

5.现在右边所有的种类都能保证取出1只,只需要再从左边取1只,即可。(也就是1)

6.最终取出的数量(2+min(8,7)+1=10)

代码实现:

class Gloves {
public:
    int findMinimum(int n, vector<int> left, vector<int> right) {
        int left_min=INT_MAX,right_min=INT_MAX;
        int left_sum=0,right_sum=0;
        int count=0;
        for(int i=0;i<n;i++)
        {
            //有一边为0的
            if(left[i]*right[i]==0)
            {
                count+=left[i]+right[i];
            }
            //sum-min+1
            else {
                left_min=left_min<left[i]?left_min:left[i];
                left_sum+=left[i];
                right_min=right_min<right[i]?right_min:right[i];
                right_sum+=right[i];
            }
        }
        return count+min(left_sum-left_min+1,right_sum-right_min+1)+1;
    }
};

文末结语,本文记录了1道动态规划题(跳石板),1道贪心(手套),如有需要,希望能有所帮助! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

批量删除python代码中的注释

ctrlh&#xff0c;调出替换功能窗口 启用正则表达式&#xff0c;输入 (#.*) 点击替换就能删除全部的注释了

【图论】LCA(倍增)

一.LCA介绍 LCA通常指的是“最近共同祖先”&#xff08;Lowest Common Ancestor&#xff09;。LCA是一种用于解决树或图结构中两个节点的最低共同祖先的问题的算法。 在树结构中&#xff0c;LCA是指两个节点的最近层级的共同祖先节点。例如&#xff0c;考虑一棵树&#xff0c;…

16.Netty源码之ChannelPipeline

highlight: arduino-light 服务编排层:ChannelPipeline协调ChannelHandlerHandler EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 Cha…

《Elasticsearch 源码解析与优化实战》第5章:选主流程

《Elasticsearch 源码解析与优化实战》第5章&#xff1a;选主流程 - 墨天轮 一、简介 Discovery 模块负责发现集群中的节点&#xff0c;以及选择主节点。ES 支持多种不同 Discovery 类型选择&#xff0c;内置的实现称为Zen Discovery ,其他的包括公有云平台亚马逊的EC2、谷歌…

C++之普通函数指针/类成员函数指针/lambda回调函数总结(一百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

边写代码边学习之卷积神经网络CNN

1. 卷积神经网络CNN 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习神经网络的架构&#xff0c;主要用于图像识别、图像分类和计算机视觉等任务。它是由多层神经元组成的神经网络&#xff0c;其中包含卷积层、池化层和全连接…

算法与数据结构-二分查找

文章目录 什么是二分查找二分查找的时间复杂度二分查找的代码实现简单实现&#xff1a;不重复有序数组查找目标值变体实现&#xff1a;查找第一个值等于给定值的元素变体实现&#xff1a;查找最后一个值等于给定值的元素变体实现&#xff1a;查找最后一个小于给定值的元素变体实…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…

玩一玩编程式 AOP

[toc] 平时我们项目中涉及到 AOP&#xff0c;基本上就是声明式配置一下就行了&#xff0c;无论是基于 XML 的配置还是基于 Java 代码的配置&#xff0c;都是简单配置即可使用。声明式配置有一个好处就是对源代码的侵入小甚至是零侵入。不过今天松哥要和小伙伴们聊一聊编程式的 …

Chapter 9: Lists | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介ListsA list is a sequenceLists are mutableTraversing a listList operationsList slicesList methodsDeleting elementsLists and functionsLists and stringsParsing linesObjects and valuesAliasingList argumentsDebuggingGlossar…

【Spring】Spring 下载及其 jar 包

根据 【动力节点】最新Spring框架教程&#xff0c;全网首套Spring6教程&#xff0c;跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理&#xff0c; 文档密码&#xff1a;mg9b…

数字签名与数字证书

数字签名与数字证书 数字签名数字证书数字证书的原理数字证书的特点 如何验证证书机构的公钥不是伪造的 数字签名 数字签名是非对称密钥加密技术与数字摘要技术的应用&#xff0c;数字签名就是用加密算法加密报文文本的摘要&#xff08;摘要通过hash函数得到&#xff09;而生成…

「回溯框架」

文章目录 0 回溯和动态规划&#xff08;dp&#xff09;的区别0.1 框架 1 刷题1.1 全排列1.1.1 题解1.1.2 Code1.1.3 结果 1.2 N皇后1.2.1 题解1.2.2 Code1.2.3 结果 0 回溯和动态规划&#xff08;dp&#xff09;的区别 动态规划的核心是穷举&#xff0c;那么回溯算法和dp有什么…

单机最快的队列Disruptor解析和使用

前言 介绍高性能队列Disruptor原理以及使用例子。 Disruptor是什么? Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果。用于解决生产者、消费者及其数据存储的设计问题的高性能队列实现。可以对标JDK中的ArrayBlockingQueue。是目前单机且…

IDC报告背后:大模型时代,重新理解AI公有云

大模型之于AI公有云的意义&#xff0c;在于大模型可以改变过去“手工作坊定制算法”的高成本模式&#xff0c;转向“工厂模式”&#xff0c;只需要微调和精调&#xff0c;就可以形成针对性的场景算法。 作者|葛覃 出品|产业家 一年前&#xff0c;依然有不少云计算从业者思…

基于智能状态和源代码插桩的 C 程序内存安全性动态分析

原文来自微信公众号“编程语言Lab”&#xff1a;基于智能状态和源代码插桩的 C 程序内存安全性动态分析 搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取更多技术内容&#xff01; 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论&#xff08;加入方式&a…

警惕!通过谷歌和必应搜索广告传播的新型恶意活动

据观察&#xff0c;一种新的恶意广告活动利用谷歌搜索和必应的广告&#xff0c;以AnyDesk、Cisco AnyConnect VPN和WinSCP等IT工具的用户为目标&#xff0c;诱骗他们下载木马安装程序&#xff0c;目的是入侵企业网络&#xff0c;并可能在未来实施勒索软件攻击。 Sophos在周三的…

Python生成pyc以及pyd文件的方法

文章目录 0. 背景1. pyc文件的生成2. pyd文件的生成3. 两者的异同 0. 背景 当有些模块的代码需要一定的保密性&#xff0c;这个时候就需要考虑pyc和pyd文件了。今天就好好琢磨一下这两种文件的生成和使用方法。让自己的知识能够朝着商业化的方向再前进一步。 1. pyc文件的生成…

为企业发展赋能增效:中国智能交通协会来访闪马智能

7月26日&#xff0c;中国智能交通协会秘书长杨颖一行来访闪马智能&#xff0c;闪马智能助理总裁兼营销与方案中心总经理黄智宏、CMO王一佳、副总裁詹诚以及副总裁兼智慧城市创新院院长邵钦豪等出席了交流会。 上海电科智能系统股份有限公司、卡斯柯信号有限公司、上海澳星照明电…

告别胆怯,大步向前,迎接新挑战!

告别胆怯&#xff0c;大步向前&#xff0c;迎接新挑战&#xff01; “赤日炎炎似火烧&#xff0c;野田禾稻半枯焦。农夫心内如汤煮。公子王孙把扇摇。”读罢《水浒传》中的这一首七绝诗&#xff0c;受其感染&#xff0c;笔者也乘兴呤顺口溜四句抒怀&#xff1a;“烈日炎炎似火…