Buy the Ticket HDU 1133 卡特兰数应用+Java大数
Suppose the cinema only has one ticket-office and the price for per-ticket is 50 dollars. The queue for buying the tickets is consisted of m + n persons (m persons each only has the 50-dollar bill and n persons each only has the 100-dollar bill).
Now the problem for you is to calculate the number of different ways of the queue that the buying process won't be stopped from the first person till the last person.
Note: initially the ticket-office has no money.
The buying process will be stopped on the occasion that the ticket-office has no 50-dollar bill but the first person of the queue only has the 100-dollar bill.
import java.util.*;
import java.math.BigInteger;
public class Main
{
public static void main(String[] args)
{
int a,b;
Scanner in=new Scanner(System.in);
int cnt=0;
while(in.hasNext())
{
cnt++;
a=in.nextInt();
b=in.nextInt();
BigInteger ans=BigInteger.ONE;
if(a==0&&b==0)break;
if(a<b) ans=BigInteger.ZERO;
else
{
for(int i=1; i<=a+b; i++)
{
ans=ans.multiply(BigInteger.valueOf(i));
}
int mpl=(a-b+1);
int dvd=(a+1);
ans=ans.multiply(BigInteger.valueOf(mpl));
ans=ans.divide(BigInteger.valueOf(dvd));
}
System.out.println("Test #"+cnt+":");
System.out.println(ans);
}
}
}
https://blog.csdn.net/qq_33171970/article/details/50644971
这位大佬的想法也很好,通过一个二维数组构造成一个矩阵,递推打表,看起来很清晰。

这张图真是太棒了。
则第m+n个人的排队方式可以看做多了第m+n个人,本来已经有了(m+n-1)个人,如果这个人拿的是50,那么就是在((m-1)+n)的基础上多了一个人,此时第m+n个人站在最后面(因为每个人都一样,所以实际上已经考虑了所有的情况),同样,如果这个人拿的是100,那么就是在(m+(n-1))的基础上多了一个人,因为人 都一样,所以又有(m,n-1)这种情况的种类,那么第m+n个人的排队类数就是(m,n-1)和(m-1,n)的和,(事实上如果最后来的那个人不站最后面那么就会出现重复的排队数,你可以试试用笔推一下)。那么递推式就出来了,我们就可以用打表的方法利用递推把m,n个人对应的排队数目用数组存储起来
我们可以发现,对角线上的数字就是卡特兰数,也就是说如果m=n,那么排队数目就是卡特兰数 。
之后求阶乘的步骤就不用再说,排队的种类数乘以m的阶乘和n的阶乘就去掉了我们之前把拿同一种钞票的人视为一样的做法的影响了,那么我们得到的就是最终答案了。小提示,求m和n的阶乘的时候即使是0的阶乘也要注意返回一个1,否则当n=0时计算结果就会出现错误~~
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
Scanner input=new Scanner(System.in);
BigInteger a=new BigInteger("1");
BigInteger c=new BigInteger("0");
BigInteger ans[][]=new BigInteger[105][105];
for(int i=0; i<=100; i++)
for(int j=0; j<=100; j++)
{
if(i<j) ans[i][j]=c;
else if(j==0) ans[i][j]=a;
else
{
ans[i][j]=ans[i][j-1].add(ans[i-1][j]);
}
}
int count=0;
while(true)
{
int m=input.nextInt(),n=input.nextInt();
if(m==0 && n==0) break;
BigInteger e=new BigInteger("1");
BigInteger f=new BigInteger("0");
for(int i=1; i<=m; i++)
{
f=f.add(a);
e=e.multiply(f);
}
BigInteger g=new BigInteger("1");
BigInteger h=new BigInteger("0");
for(int i=1; i<=n; i++)
{
h=h.add(a);
g=g.multiply(h);
}
BigInteger b=ans[m][n].multiply(e).multiply(g);
System.out.println("Test #"+ ++count+":");
System.out.println(b);
}
}
}
Buy the Ticket HDU 1133 卡特兰数应用+Java大数的更多相关文章
- hdu1133 Buy the Ticket (卡兰特数应用+java大数)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1133 [题意] 电影票50块一张 有m个人手里正好有50块,n个人手里正好有100块,售票厅開始没有 ...
- hdu 1133(卡特兰数变形)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1133 题意:排队买50块一张的票,初始票台没有零钱可找,有m个人持有50元,n人持有100元, ...
- Buy the Ticket HDU 1133 递推+大数
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1133 题目大意: 有m+n个人去买电影票,每张电影票50元, m个人是只有50元一张的, n个人 ...
- Buy the Ticket HDU 1133
传送门 [http://acm.hdu.edu.cn/showproblem.php?pid=1133] 题目描述和分析 代码 #include<iostream> #include< ...
- Buy the Ticket HDU - 1133 大数dp
题意: 演唱会门票售票处,那里最开始没有零钱.每一张门票是50元,人们只会拿着100元和50元去买票,有n个人是拿着50元买票,m个人拿着100元去买票. n+m个人按照某个顺序按序买票,如果一个人拿 ...
- hdu 1133 卡特兰 高精度
Buy the Ticket Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu 1023 卡特兰数+高精度
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 4828 (卡特兰数+逆)
HDU 4828 Grids 思路:能够转化为卡特兰数,先把前n个人标为0.后n个人标为1.然后去全排列,全排列的数列.假设每一个1的前面相应的0大于等于1,那么就是满足的序列,假设把0看成入栈,1看 ...
- hdu 1130,hdu 1131(卡特兰数,大数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
随机推荐
- ABAP术语-XML
XML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/21/1115743.html The "eXtensible Markup ...
- javascript对象定义及创建
javascript对象 定义 javascript中的对象,可以理解成是一个键值对的集合,键是调用每个值的名称,值可以是基本变量,还可以是函数和对象. 创建方法 第一种方法 通过顶级Object类来 ...
- Redis简单介绍与数据类型
介绍 分布式缓存 NoSql:解决高并发.高可用.高可扩展,大数据存储等一系列问题而产生的数据库解决方案. Redis:键值(Key-Value)存储数据库 Redis是使用c语言开发的一个高性能键值 ...
- PhpStorm 克隆下来的项目改动,版本控制不起效果
打开的目录 —>多个 git项目—>版本控制无法监控. 打开的目录 —>一个 git项目—>版本控制可以监控.
- Flume(1)-概述与组成架构
一. 定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume基于流式架构,灵活简单. 二. 优点 1. 可以和任意集中式存储进程集成. 2. ...
- 树莓派安装DNSMASQ服务
功能: DNSMASQ是一款高性能的.小型的DNS服务器软件. * 缓存域名.IP地址,本地缓存解析的地址. * DHCP服务 1.安装 sudo apt-get update sudo apt-ge ...
- python3 class类 练习题
"""一.定义一个学生Student类.有下面的类属性:1 姓名 name2 年龄 age3 成绩 score(语文,数学,英语) [每课成绩的类型为整数] 类方法:1 ...
- 30. Insert Interval【LintCode by java】
Description Given a non-overlapping interval list which is sorted by start point. Insert a new inter ...
- 20155202 2016-2017-2 《Java程序设计》第4周学习总结
20155202 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承与多态: 子类和父类有(is a)关系,Role role1 =new Swordsma ...
- 2016-2017-2 20155302 实验四 Android 开发基础
2016-2017-2 20155302 实验四 Android 开发基础 实验内容 1.下载和安装Android Studio 2.学会使用Android Studio进行简单的Android开发 ...