[蓝桥杯] 数学与简单DP问题

news2024/11/25 8:20:02

  

文章目录

一、简单数学问题习题练习 

1、1 买不到的数目

1、1、1 题目描述

1、1、2 题解关键思路与解答

1、2 饮料换购

1、2、1 题目描述

1、2、2 题解关键思路与解答

二、DP问题习题练习

2、1 背包问题

2、1、1 题目描述

2、1、2 题解关键思路与解答

2、2 摘花生

2、2、1 题目描述

2、2、2 题解关键思路与解答

2、3 最长上升子序列

2、3、1 题目描述

2、3、2 题解关键思路和解答

 三、总结 


标题:蓝桥杯——数学与简单DP问题习题练习

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

 

一、简单数学问题习题练习 

  蓝桥杯比赛中常见的还有一类数学问题,这些数学问题有的是有公式计算,有的是考察的思维逻辑。我们具体来看例题。

1、1 买不到的数目

1、1、1 题目描述

题目来源:第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组

题目难度:简单

题目描述:小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式:

  两个正整数 n,m,表示每种包装中糖的颗数。

输出格式:

  一个正整数,表示最大不能买到的糖数。

数据范围:

  2≤n,m≤1000,
  保证数据一定有解。

输入样例:

4 7

输出样例:

17

1、1、2 题解关键思路与解答

  我们先关插题目,是两个数找到这两个数最大凑不出来的数。当两个数是由除1外还有其他的公约数时,我们发现并不能找到这两个数最大凑不出来的数。也就是当两个数互质时,才能够找出这两个数最大凑不出来的数。这里是有一个公式的,我们假设这两个数分别是p、q,两个数互质,那么求这两个数最大凑不出来的数的公式为:(p-1)*(q-1)-1。我们看一下本题的代码。

#include<iostream>

using namespace std;

int p,q;

int main()
{
    cin>>p>>q;
    
    cout<<(p-1)*(q-1)-1;
    return 0;
}

1、2 饮料换购

1、2、1 题目描述

题目来源:第六届蓝桥杯省赛C++A/C组,第六届蓝桥杯省赛JAVAB组

题目难度:简单

题目描述:乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。

输入格式:

  输入一个整数 n,表示初始买入的饮料数量。

输出格式:

  输出一个整数,表示一共能够喝到的饮料数量。

数据范围:

  0<n<10000。

输入样例:

100

输出样例:

149

1、2、2 题解关键思路与解答

  本题目主要考察的是思维逻辑能力。我们要注意的是本题有一个陷阱,就是我们需要注意用瓶盖换瓶子的时候可能会有剩余,下次再换的时候我们的瓶盖数量就是已经换购的饮料数量加喝完上上次剩下的瓶盖数量。我们直接看代码。

#include<iostream>

using namespace std;

int n;

int main()
{
    cin>>n;
    
    int sum=n;
    
    int ret=n;
    while(ret >= 3)
    {
        sum+=ret/3;
        ret=ret/3+ret%3;
    }
    cout<< sum;
    return 0;
}

二、DP问题习题练习

2、1 背包问题

2、1、1 题目描述

题目来源:AcWing

题目难度:简单

题目描述:有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。

输入格式:

  第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

  接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式:

  输出一个整数,表示最大价值。

数据范围:

  0<N,V≤1000,
  0<vi,wi≤1000。

输入样例:

4 5
1 2
2 4
3 4
4 5

输出样例:

8

2、1、2 题解关键思路与解答

  这里我们用闫氏DP分析法进行分析:   上述思想的关键就是状态计算。我们不选第 i 个物品时,其前 i-1个物品的总价值和为      f[i-1][j],那么第 i 个物品的价值也为 f[i-1][j]。如我们选上第 i 个物品时,计算其价值为前 i-1 个物品的价值表示为 f[i-1][j-v[i]],那么选上第i个物品的价值为 f[i-1][j-v[i]] + w[i]。在两者值减去一个较大的就行。我们看代码的实现。

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N =1010;

int f[N][N];

int n,m;

int v[N],w[N];
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>v[i]>>w[i];
        
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            f[i][j]=f[i-1][j];
            
            if(j>=v[i])
                f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    
    cout<<f[n][m]<<endl;
    return 0;
}

2、2 摘花生

2、2、1 题目描述

题目来源:《信息学奥赛一本通》

题目难度:简单

题目描述:Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。

输入格式:

  第一行是一个整数T,代表一共有多少组数据。

  接下来是T组数据。

  每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。

  每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目M。

输出格式:

  对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。

数据范围:

  1≤T≤100,
  1≤R,C≤100,
  0≤M≤1000。

输入样例:

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

输出样例:

8
16

2、2、2 题解关键思路与解答

  该题我们同样用闫氏DP分析法:   状态计算中的集合划分大部分情况下的依据是最后不相同的一步。这道题就是走到右下角只能是从正上走过来,或者正左走过来。我们只需要选出这两者的较大的一个,再加上右下角的花生数量即可。我们结合着代码一起理解一下。

#include<iostream>

using namespace std;

const int N=110;

int f[N][N],w[N][N];

int n,m;

int main()
{
    int T=0;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&w[i][j]);
            }
        }
        
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j];
            }
        }
        cout<<f[n][m]<<endl;
    }
    return 0;
}

2、3 最长上升子序列

2、3、1 题目描述

题目来源:AcWing

题目难度:简单

题目描述:给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式:

  第一行包含整数 N。

  第二行包含 N 个整数,表示完整序列。

输出格式:

  输出一个整数,表示最大长度。

数据范围:

  1≤N≤1000,
  −1e9≤数列中的数≤1e9。

输入样例:

7
3 1 2 1 8 5 6

输出样例:

4

2、3、2 题解关键思路和解答

  该题目可能会给很多同学造成一个错误的理解。题目中的要求是求数值严格单调递增的子序列的长度最长是多少,指的是不是连续的也行。如上述案例,最大上升子序列为:1,2,5,6。那该怎么求呢?我们用闫氏DP法进行分析:

  这里关键的就是我们枚举出以i结尾的最大的长度即可。最后在从不同结尾当中找出最大值。那我们怎么计算出以i结尾的最大长度呢?我们只需要在i之前,且比 a[i] 的就行,更新 f[i] 的值即可。我们结合着代码一起理解一下:

#include<iostream>

using namespace std;

const int N=1010;

int a[N],f[N];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    
    for(int i=1;i<=n;i++)
    {
        f[i]=1;
        for(int j=1;j<i;j++)
        {
            if(a[j]<a[i])
                f[i]=max(f[i],f[j]+1);
        }
    }
    
    int res=0;
    for(int i=1;i<=n;i++)
        res=max(res,f[i]);
        
    cout<<res;
    return 0;
}

 三、总结 

  关于数学的问题,我们主要是对刷题进行练习巩固。DP动态规划的问题大多数情况是有固定的分析路线,也是需要多加做题练习。

  今天的练习就到这里,希望以上内容对你有所帮助,感谢观看。

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

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

相关文章

收个滴滴Offer:从小伙三面经历,看看需要学点啥?

说在前面 在尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试大厂。 后续结合一些大厂的面试真题&#xff0c;给大家梳理一下学习路径&#xff0c;看看大家需要学点啥&#xff1f; 这里也一并把题目以及参考答案&#xff0c;收入咱…

Spring 容器创建初始化,获取bean流程分析

Spring 容器创建初始化&#xff0c;获取bean流程分析 Spring 容器创建初始化 流程分析 1、首先读取bean.xml 文件 2、扫描指定的包 com.hspedu.spring.component 2.1、扫描包&#xff0c;得到bean的class对象&#xff0c;排除包下不是bean的 2.2、扫描将bean信息封装BeanDef…

python之selenium库安装及用法(定位法、获取文本、文本框输入、鼠标点击、滑动滚动条)

一、selenium库安装 pip install selenium二、浏览器驱动安装 谷歌浏览器驱动下载地址&#xff1a;https://chromedriver.storage.googleapis.com/index.html 根据你电脑的谷歌浏览器版本&#xff0c;下载相应的就行。我下载的是110.0.5481.XX中的chromedriver_win32.zip 下载…

无公网IP快解析实现U+随时随地访问

现阶段商品从生产到消费者手中要经过多个环节&#xff0c;为实现对每一个环节进行管理&#xff0c;越来越多的企业选择通过信息化手段来实现。供应链管理系统配合供应链中各实体的业务需求&#xff0c;使操作流程和信息系统紧密配合&#xff0c;做到各环节无缝链接&#xff0c;…

【C++】string类的使用

目录 一、标准库中的string类 二、string类的常用接口 1、string类对象的常见构造 2、string类对象的容量操作 2.1、size 与 length 2.2、capacity 与 reserve 2.3、resize 2.4、总结 3、string类对象的访问及遍历操作 3.1、operator[] 与 at 3.2、begin end 3.3、…

Portraiture5人像磨皮润色修饰插件

Portraiture3和Portraiture4这两个版本大家用的比较多&#xff0c;那是因为这两个版本是中文比较全的版本。portraiture是一款强大的64位PS磨皮滤镜&#xff0c;利用该PS滤镜插件可以对图片中的人物进行润色&#xff0c;磨皮等操作&#xff0c;处理皮肤材质、头发等。帮您消除了…

HNU工训中心:平台 2HDL 语言与验证实验报告

一、自定 FSM 说明 1、状态描述 State0&#xff1a;睡觉&#xff0c;如果闹钟响则起床吃早餐&#xff0c;否则继续睡觉 State1&#xff1a;吃早餐&#xff0c;吃完去上课 State2&#xff1a;上课&#xff0c;上完课后如果要开会就去开会&#xff0c;否则去自习 State3&…

LiveGBS国标GB/T28181视频流媒体平台-功能视频集中录制存储云端录像H264|H265|HEVC视频存储

LiveGBS国标GB/T28181视频流媒体平台-视频集中录制存储云端录像H264|H265|HEVC视频存储1、云端录像存储2、手动配置录像2.1、按需录像2.2、一直录像3、录像计划3.1、录像计划入口3.2、新增录像计划3.3、编辑录像计划3.4、关联通道4、查看云端录像4.1、查看录像4.1.1、时间轴模式…

vue路由文件拆分管理

随着项目的原来越大&#xff0c;路由越来越多&#xff0c;我们的路由也会越来越多&#xff0c;如果都集中在一个文件中&#xff0c;会很冗杂文件很长。这时候我们可以将路由文件拆分&#xff0c;可读、方便管理。多人合作添加路由也能更多的避免代码冲突 代码拆分目录如图&…

18 客户端服务发现源码分析

Nacos客户端服务发现源码分析 总体流程 首先我们先通过一个图来直观的看一下&#xff0c;Nacos客户端的服务发现&#xff0c;其实就是封装参数、调用服务接口、获得返回实例列表。 但是如果我们要是细化这个流程&#xff0c;会发现不仅包括了通过NamingService获取服务列表&…

运筹系列79:使用Julia进行column generation求解

1. 案例建模 我们对cutting stock问题进行建模。rolls的尺寸为W&#xff0c;每个型号的需求量和尺寸分别为d和w&#xff0c;如下&#xff1a; struct Piecew::Float64d::Int endstruct Datapieces::Vector{Piece}W::Float64 endfunction Base.show(io::IO, d::Data)println(i…

hls.js如何播放m3u8文件(实例)?

HLS&#xff08;HTTP Live Streaming&#xff09;是一种视频流传输协议&#xff0c;是苹果推出的适用于iOS与macOS平台的流媒体传输协议。它将视频分割成若干个小段&#xff0c;每个小段大小一般为2~10秒不等&#xff0c;并通过HTTP协议进行传输。通过在每个小段之间插入若干秒…

C++学习笔记-多线程

传统的C&#xff08;C11之前&#xff09;中并没有引入线程这个概念&#xff0c;在C11出来之前&#xff0c;如果我们想要在C中实现多线程&#xff0c;需要借助操作系统平台提供的API&#xff0c;比如Linux的<pthread.h>&#xff0c;或者windows下的<windows.h> 。 …

数据结构——链表讲解(1)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月3日 内容&#xff1a;数据结构链表讲解 目录 前言&#xff1a; 链表的概念&#xff1a; 1.为什么要有链表&#xff1a; 2.链表的运行原理&#xff1a; 3.链表的形态多少&#xff1a; 4.单链表的代码书写&#xff1…

QML定时器

QML使用Timer使用定时器 Timer 计时器可用于触发操作一次&#xff0c;或以给定的间隔重复触发。 常用属性&#xff1a; interval 设置触发器之间的间隔&#xff08;以毫秒为单位&#xff09;。 默认间隔为 1000 毫秒。 repeat 设置重复&#xff0c;为真&#xff0c;则以指定的…

【力扣】stack容器的探索之有效的括号

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《算法详解》 愿你生如夏花之绚烂&#xff0c;幸运永远与你相伴&#xff0c;疯狂常在。 目录一. &#x1f981; Stack容器的来历1.1 操作栈的方法二. &#x1f981; Stack的使用2.1 题目2.2 分析2.3 详细算法实现2.4 力扣AC截图三…

vscode与C++安装与使用【不好用来骂我】

网上教程很多&#xff0c;但是都不太好用&#xff0c;这是我垃圾堆里淘金淘出来的教程&#xff1a; 安装软件 安装 Visual Studio Code: 你需要下载并安装 Visual Studio Code&#xff0c;可以在官网下载 https://code.visualstudio.com/download。 安装 C 扩展: 在 Visual S…

【基础算法】单链表的OJ练习(2) # 链表的中间结点 # 链表中倒数第k个结点 #

文章目录前言链表的中间结点链表中倒数第k个结点写在最后前言 对于单链表的OJ练习&#xff0c;需要深刻理解做题的思路&#xff0c;这样我们才能够在任何场景都能够熟练的解答有关链表的问题。 关于OJ练习&#xff08;1&#xff09;&#xff1a;-> 传送门 <-&#xff0c…

支持向量机简单介绍

1.概述 支持向量机&#xff08;SVM&#xff0c;支持向量网络&#xff09;&#xff0c;是机器学习中获得关注最多的算法没有之一。它源于统计学习理论。 | | | 功能有监督学习线性二分类与多分类&#xff08;Linear Support Vector Classification&#xff09;非线性二分类与多…

你真的会用三元运算符吗?

在我们日常搬砖中&#xff0c;我们经常会看到三元运算符&#xff0c;但是你了解三元运算符到底是怎么用吗&#xff1f;接下来我们就下来详细介绍一下三元运算符大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#x…