20241018每日一题洛谷P2386

news/2024/10/18 22:04:26/文章来源:https://www.cnblogs.com/dianman/p/18475128

普及 每日一题 信息学竞赛 1206:放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

对输入的每组数据M和N,用一行输出相应的K。

看到题目第一眼,这不是排列组合吗?!
遂进行C A组合,未能找到严格的通项公式,只能递推寻找答案

思路如下:

对于m个苹果,n个盘子

首先考虑特殊情况:(实际上可以不用考虑)

m = 0 时:即没有苹果可以瓜分,有 0 种分法

n = 0 时:即没有盘子可以放置,有 0 种分法

m < 0 时:不存在实际情况,有 0 种分法

if (m==0) return 0;
if (n==0) return 0;

考虑递归公式:

从n个盘子开始,对于分苹果的方法有两种:

不分给第n个盘子||分给所有的盘子

先解释第一种情况:

从第n个盘子开始,假如后面的所有盘子也都不给分苹果

这样的话将会导致最后没有办法安置苹果,则为 n = 0 时的特殊情况 返回0

解释第二种情况:

从m个苹果开始,每次都给所有的盘子都分一个苹果,假如后面都是这样操作

则必会有一次操作后使得 m <= 0 这时显然返回 0

if (m<=0) return 0;

当 m = 1 时:这时如果盘子不为 0 个,则有且仅有一种分法,返回 1

当 n = 1 时:这时如果苹果不为 0 个,则有且仅有一种分法,返回 1

if (m==1) return 1;
if (n==1) return 1;

可以发现,在 m或n 等于 1 时递推已经有了返回值,则无需考虑 m或n 等于 0 时的情况

回过头我们来解释一下为什么会有这两种分苹果的方法

第一种方法不难想到,第二种方法可能有点困难

我们由下往上来考虑这个问题:

假设我们有一颗二叉树描述递归的过程

root节点为 (m,n) ,令左孩执行的操作为 (m,n) -> (m,n-1) ,右孩执行的操作为 (m,n) -> (m-n,n)

对整棵树的节点而言 :

所有左孩执行的操作的方向为一条形似于由左下贯穿右上的直线

所有右孩执行的操作的方向为一条形似于由右下贯穿左上的直线

当 n = 1 的时候,即我们只有一个盘子可以放我们剩下的苹果

递归执行右孩操作可以得到一条形似于由右下贯穿左上的直线,这条直线位于所有由右孩操作组成的直线集的底层

当 n = 2 的时候,即我们只有两个盘子可以放我们剩下的苹果

递归执行右孩操作也可以得到一条形似于由右下贯穿左上的直线,这条直线位于 n = 1 的直线的上一层

同理,可以得出 n =n 的时候,这条右孩操作直线为直线集的顶层,从最后一层的特殊性,往回推出第一层该如何操作

即root节点的右孩操作该如何执行

核心代码如下:

using namespace std;
int count(int m, int n) {if (m < 0) return 0;if (m == 1) return 1;if (n == 1) return 1;return count(m-n, n) + count(m, n - 1);
}
int main()
{	int t;scanf("%d", &t);for (int i = 0; i < t; i++) {int m, n,ans=0;scanf("%d %d", &m, &n);printf("%d", count(m, n));}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片与向量的关系

如何从向量角度描述表示图片黑白图片黑白图片(灰度图)通过 2 维向量(矩阵)来表达。2个维度的长度分别代表了图片的高度和宽度(以像素为单位),向量元素记录着每一个像素的灰度(数值越大,颜色越浅) 例如下面右图矩阵标注了左图像素点的灰度分布:彩色图片彩色图片通过 …

数据采集与融合技术第二次作业

学号姓名 102202132 郑冰智这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13285这个作业的目标 爬取天气网、股票相关信息、中国大学2021主榜所有院校信息,并存储在数据库中实验二仓库地址 https://gitee.com/zheng…

【LGR-203-Div.4】洛谷入门赛 #28

【LGR-203-Div.4】洛谷入门赛 #28\(A\) luogu B4042 [语言月赛 202410] 顺序结构 \(AC\)顺序结构。点击查看代码 int main() { ll a;cin>>a;cout<<3*(5+a)<<" "<<3*a+5<<endl;return 0; }\(B\) luogu B4043 [语言月赛 202410] 刻度尺…

uni-app小程序(快手、抖音)getCurrentPages使用坑位记录2

前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,现公司项目就是主推uni-app,我主要负责抖音和快手端小程序。 坑位 公司历史原因项目有APP端小程序端,但并不使用uni-app的一端发布所有平台,…

二叉查找树和笛卡尔树

二叉查找树~和笛卡尔树目录二叉查找树定义作用操作查找插入删除缺点笛卡尔树定义操作构造 二叉查找树 定义 ​ 二叉查找树(Binary Search Tree,BST),又名二叉搜索树或二叉排序树。 ​ 它是一类特殊规定的二叉树,它应当满足以下条件:每个节点有唯一确定的权值 非叶子节点的…

浅谈 tarjan

就是记录两个数组:dfn[]和low[] 其中dfn[]表示访问的顺序,low[u]用来存储 \(u\) 不经过其父亲能到达的最小时间戳。。。 搬一下 wiki 的图。。。我们发现 \(low[v]\ge dfn[u]\) 可以表示不能回到祖先,则 \(u\) 点位割点。。。 直接上代码P3388------> #include <bits/…

正点原子新起点V2开发板FPGA关于SDRAM代码解读

正点原子新起点V2开发板FPGA关于SDRAM代码解读 1. SDRAM 概述 SDRAM(Synchronous Dynamic Random Access Memory)是一种同步动态随机存储器,广泛用于FPGA项目中。通过SDRAM控制模块,可以实现数据读写、刷新等操作。本文对SDRAM的控制模块进行详细解读,分析代码中的命令控制…

面试题速刷 - 实战会碰到的一些问题

页面如何进行首屏优化?路由懒加载服务端渲染SSR只获取HTML就可以,里面包含data。 APP预取(啥东西)APP结合H5、结合JS bridge 分页图片懒加载 lazyloadHybrid总结:后端一次性返回10w条数据,你会如何渲染? 本身后端设计方案的设计就不合理!非要的话......自定义中间层:虚…

氏发

这个作业属于哪个课程 2024高级语言程序设计 (福州大学 - 计算机与大数据学院)这个作业要求在哪里 高级语言程序设计课程第三次个人作业学号 102400117姓名 廖逸轩

二、STM32F103C8T6-定时器

STM32F103C8T6 定时器概述 STM32F103C8T6 作为一款广泛使用的微控制器,内置多个定时器,能够支持多种计时和控制功能,如精确延时、脉冲宽度调制(PWM)、捕获比较(Capture/Compare)、输入捕获 和 输出比较 等。这些功能在电机控制、信号测量、周期性事件触发等应用中非常常…

Sparse Table

Sparse Table 可用于解决这样的问题:给出一个 \(n\) 个元素的数组 \(a_1, a_2, \cdots, a_n\),支持查询操作计算区间 \([l,r]\) 的最小值(或最大值)。这种问题被称为区间最值查询问题(Range Minimum/Maximum Query,简称 RMQ 问题)。预处理的时间复杂度为 \(O(n \log n)\…

计量经济学(十一)——联立方程模型的估计

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 联立方程模型(Simultaneous Equations Model, SEM)是一类包含多个相互依赖变量的统计模型,用来描述这些变量之间的相互关系。在传统的单一方程模型中,通常…