高中数学的排列组合,在许多题目中也有应用。甚至可以达到更快的解题速度,同时也会减少时间复杂度。

一般应用

拿NYOJ的一道题为例。https://acm.nyist.edu.cn/p/210。

通过读题我们可以发现,这个题,只是我们高中所学的排列组合的基础公式。

但是我们不能直接使用最后的结论公式,我们知道int,long long 都是有范围的,而阶乘的形式,不用太大的数目,就会超过数据范围,引起答案出错,所以我们需要的是优化计算方法。一步一步计算。类似于中间式子的计算过程,这样就可以达到我们的目的;(当然需要减少循环次数,不然铁tle。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<vector>
#include<string.h>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{ll n,m;ll T ;cin >> T;while(T--){cin >> n >> m;  ll k;if(n - m < m)  // 此处就是优化循环的方式,可以在纸上模拟几组小数据。{ k = n - m;m = k;}//cout << k << endl;else {k = m;}//  cout << k << endl;double ans = 1;for(int i = 1; i <= k; i++){ans =ans * (n--)/(m--);}if(ans - (ll)ans >= 0.5)cout << (ll)ans + 1 << endl;else cout << (ll)ans << endl;}
}

隔板法应用

先上题目链接https://acm.nyist.edu.cn/p/871

前几天南阳理工校赛A题,因为当时比较笨比,没a出来。

首先对题目进行分析。简单来说,题目就是让我们找到最多m个数的和等于m的情况有几种。

下边是用DFS打的表,

从表中我们得到dp[i][j]=dp[i-1][j-1]+dp[i-1][j];所以我们可以用二维数组直接打表,然后选取指定的数进行输出。本方法在此不多叙述。

下边我们说一下和隔板法的联系。

从图中我们可以得知,以m=4为例。

我们 先留4个空,代表最多四个未知数。

当n=1 的时候,也就是一个板子都没插入,只有一种情况。

当n=2的时候,相当于在3个空里面插入一个板子。

同理类推。n=3的时候插入了俩板子。

n=4的时候,三个空全部都是已插入的状态。

这样,就成了我们排列组合的隔板法。

就是我们所推出的公式。也就是高中的隔板法公式

现在的任务就是求这个式子的解了。如何求解?

当你理解了第一个买水果的时候,你就会发现,这两道题几乎一模一样(更后悔了,没写出来。。。)

设X=n-1,Y=n+m-1.这样化简后,是一个范围比买水果小的多的一个排列组合方程。

Ac代码如下

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<vector>
#include<string.h>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{ll x,y;cin >> x >> y;ll n,m;m = y - 1;n = x + y - 1;    ll k;if(n - m < m){ k = n - m;m = k;}//cout << k << endl;else {k = m;}//  cout << k << endl;double ans = 1;for(int i = 1; i <= k; i++){ans =ans * (n--)/(m--);}if(ans - (ll)ans >= 0.5)cout << (ll)ans + 1 << endl;else cout << (ll)ans << endl;
}

到此感谢各位的阅读。希望可以给大家提供帮助。

排列组合的简单应用(隔板法)相关推荐

  1. 牛客练习赛64 - A.怪盗-1412(排列组合,简单数学)

    链接:https://ac.nowcoder.com/acm/contest/5633/A 来源:牛客网 示例1 输入 3 6 7 8 1 2 2 6 0 3 输出 504 0 0 备注: 1< ...

  2. 排列组合算法之三: 递归法

    a. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止. b. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数 ...

  3. c语言编程数字字母排列组合,用简单的排列组合解决字符排列问题 (C语言代码)...

    解题思路: 先计算出所有字符的排列总数,再除以重复字母的排列数 注意事项: 参考代码:#include int main() { int len,i,j,m,n=1,a[26]={0};        ...

  4. 高中数学基础05:排列、组合以及隔板法

    内容来自百度百科知识以及东方耀老师笔记内容的整合 1.排列组合基本概述 排列组合是组合学最基本的概念.所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序.组合则是指从给定个数的元素中仅仅取出 ...

  5. c++ 排列组合_省考行测数量关系的老大难,排列组合的基本类型题及秒杀技巧...

    作者:步知公考上岸学员 Jud°米娅 不知不觉省考剩下50多天了,这50多天要想行测更上一层楼,除了保证资料分析等模块的准确率(70%-80%),数量关系也不可以丢太多的分数,而数量关系自认为最难的题 ...

  6. 排列组合中关于捆绑法、插空法、插隔板法

    捆绑法:当要求某几个元素必须相邻(挨着)时,先将这几个元素看做一个整体,(比如:原来3个元素,整体考虑之后看成1个元素)然后将这个整体和其它元素进行考虑.这时要注意:一般整体内部各元素如果在前后顺序上 ...

  7. 排列组合---隔板法

    1.定义 隔板法就是在n个元素间插入(b-1)个板,即把n个元素分成b组的方法.C(n-1,b-1) 2.条件 隔板法必须满足三个条件: (1)这n个元素必须相同,(2)所分成的每一组至少分得一个元素 ...

  8. java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合

    今天,我们来简单介绍一下深度优先搜索(DFS)的概念和使用. 在百度词条中,对深搜的解释是这样的. 百度词条中的解释 由此,我们可知,深搜是广泛运用到 图 中的搜索方法之一. 用深度优先搜索遍历图的基 ...

  9. 排列组合之插板法及变形

    主要用于"相同元素"分到"不同容器"的排列组合. [例1] 共有10本相同的书分到7个班里,每个班至少要分到一本书,问有几种不同分法? [解析]注意,这里面有个 ...

最新文章

  1. AOP的实现机制--转
  2. 什么是自然语言处理,它如何工作?
  3. 五分钟完成 ABP vNext 通讯录 App 开发
  4. Scanner获取用户输入
  5. LeetCode 991. 坏了的计算器(逆向思考)
  6. c++内联函数解析(inline)
  7. 复习HTML+CSS(5)
  8. android 投屏原理图,手机投屏是什么原理
  9. 中级通信工程师证书会过期吗
  10. 模拟退火算法求解超市布局问题
  11. 旋转矩阵是正交矩阵与伴随性质的证明
  12. 基于Handsome主题的站点页脚美化教程
  13. 阿里巴巴2016年-校招-实习生岗位-内推
  14. mysql查询所有图书信息_PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
  15. linux下apache 的安装,php安装过程
  16. DAO终极之问:去中心化组织归谁所有?
  17. SAP HANA首次在农夫山泉成功上线
  18. 实习 | 深圳市彼岸心智科技有限公司招募新成员啦
  19. Android学习笔记(2)——探究活动
  20. 网络协议与服务的区别/关系

热门文章

  1. sap服务器迁移性能问题,专家详解SAP数据迁移的六个方法
  2. 自学 1 年进大厂,这位硬核 Linux 大佬你还不知道?
  3. 有哪些道理是你毕业多年后才明白的?
  4. hive sql 实现姓名手机号证件号脱敏
  5. Centos-7使用的性能监控工具
  6. EeePC各项硬件参数
  7. 6款新电脑必装优质软件,一个比一个更好用
  8. 登录可以用微信的163邮箱!TOM VIP商务邮全新而来!
  9. 【Java】Java爬取国家统计局五级行政区划编码(省、市(州)、县(区)、乡(镇)、村)
  10. 计算机术语tops,第十七课计算机辅助包装系统TOPSPro简介TOPSPro包装优化软件.DOC...