首页 > 其他分享 >20241018每日一题洛谷P2386

20241018每日一题洛谷P2386

时间:2024-10-18 22:01:59浏览次数:1  
标签:直线 return P2386 int 20241018 右孩 苹果 洛谷 盘子

普及 每日一题 信息学竞赛 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;
}

标签:直线,return,P2386,int,20241018,右孩,苹果,洛谷,盘子
From: https://www.cnblogs.com/dianman/p/18475128

相关文章

  • 【LGR-203-Div.4】洛谷入门赛 #28
    【LGR-203-Div.4】洛谷入门赛#28\(A\)luoguB4042[语言月赛202410]顺序结构\(AC\)顺序结构。点击查看代码intmain(){lla;cin>>a;cout<<3*(5+a)<<""<<3*a+5<<endl;return0;}\(B\)luoguB4043[语言月赛202410......
  • 洛谷 P1983 [NOIP2013 普及组] 车站分级(拓扑排序)
    题目传送门解题思路对于每一趟列车,我们可以知道其中没有经过的车站的级别肯定会比经过的车站的级别低。于是,我们可以根据这种关系来建一个图。将等级小的车站往等级大的车站建边。于是,我们可以发现这是一个DAG(有向无环图),所以我们可以拓扑排序。我们从等级最小的车站......
  • 20241018打卡
    Simai是一种用于绘制maimaiDX谱面的脚本语言,主要用于定义游戏中的音符位置、类型和时间,使玩家能够在触摸屏上按照音乐节奏进行操作。这种语言广泛用于创建自定义谱面,为maimaiDX提供独特的挑战和体验。Simai语言的基本语法:文件头和元数据:通常在脚本开头定义一些元数据,......
  • 洛谷 P8572 [JRKSJ R6] Eltaw 做题记录
    zhr随机跳题跳到的,遂做之。注意到\(nk\le5\times10^5\),考虑根号分治。当\(n\)很大时,\(k\)会很小,于是我们记录每一行的前缀和,每一次循环\(k\)个数组的前缀和取\(\max\)即可,时间复杂度\(O(qk)\)。当\(k\)很大时,\(n\)会很小,我们暴力预处理区间\([l,r]\)的最大值,......
  • 洛谷 P2886 [USACO07NOV] Cow Relays G 做题记录
    设矩阵\(M^1=\begin{bmatrix}dis_{1,1}&\dots&dis_{1,n}\\\vdots&\ddots&\vdots\\dis_{1,n}&\cdots&dis_{n,n}\end{bmatrix}\),其中\(dis_{i,j}\)表示\(i\)是否能在\(1\)步内走到\(j\)。让我们回忆一下矩阵乘法,\(c_{i,j......
  • 洛谷题单指南-字符串-P2922 [USACO08DEC] Secret Message G
    原题链接:https://www.luogu.com.cn/problem/P2922题意解读:已知M个01串,给出N个01串,对于N个串的每一个,求在M个串中有多少与其有公共前缀,且前缀长度是两个串中较小者。解题思路:用Trie树存储M个01串,用cnt1[]记录某个节点结束的01串个数,cnt2[]记录经过某个节点的01串的数量对于N个0......
  • 洛谷题单指南-字符串-P2375 [NOI2014] 动物园
    原题链接:https://www.luogu.com.cn/problem/P2375题意解读:计算字符串所有子串的不重叠相同前后缀数量。解题思路:1、KMP+暴力通过Next数组,可以计算所有子串相同前后缀的数量然后枚举Next数组,通过回跳Next[j]、Next[Next[j]-1]、Next[Next[Next[j]-1]-1]......来统计长度小于......
  • 20241016每日一题洛谷P1115
    普及-洛谷P1115最大子段和读题可知需要在一段一维数组中寻找一段唯一的区间,使区间内的数和最大,即寻找和最大区间可以想到前缀和的算法假设输入数组a[n]则前缀和数组b[n]=b[n-1]+a[n]那么从什么时候开始的一段区间才能使区间内的数和最大?从前缀和数组逐步来判断这一条......
  • 洛谷题单指南-字符串-P3435 [POI2006] OKR-Periods of Words
    原题链接:https://www.luogu.com.cn/problem/P3435题意解读:定义字符串a是b的周期,当a是b的真前缀,且b是aa的前缀。给定字符串s,求s每一个前缀的最大周期长度之和。解题思路:针对字符串babababa进行样例模拟:前缀子串  最大周期  周期长度b空0ba空0babba2......
  • 洛谷 P5175 数列 题解
    纯纯数学题。看到\(n\le10^{18}\)不难想到矩乘,但是\(\log_210^{18}\approx60\),再加上\(T=30000\)的多测,运算量已经来到了\(1.8\times10^6\),所以我们最多有一个\(\sqrt[3]{\frac{1.5\times10^8}{6\times10^6}}\approx4\)的矩阵。\[\becausea_i=xa_{i-1}+ya_{......