HDU 1133 Buy the Ticket 卡特兰数 JAVA
2015-12-11 00:03
417 查看
题意:一行人排队买票,一张票50元,有m个持有50面值钞票的人,有n个持有100面值钞票的人。问,有多少种方案能够让窗口可以让前面人的钱把后面人的钱找开来,也就是说持有50面值钞票的人要尽量放在100面值钞票的人的前面。
思路:持有50面值钞票的人要尽量放在100面值钞票的人的前面。这是一个卡特兰数的模型了。另外因为每个人是不同的,所有结果要乘上n!n!和m!m!,因为结果比较大,我就偷懒选了javajava来写。
http://acm.hdu.edu.cn/showproblem.php?pid=1133/********************************************* Problem : HDU 1133 Author : NMfloat InkTime (c) NM . All Rights Reserved . ********************************************/ import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String argv[]) { Scanner cin = new Scanner(System.in); BigInteger [] F = new BigInteger[105]; BigInteger [][] f = new BigInteger[105][105]; for(int i = 0 ; i <= 100 ; i ++) for(int j = 0 ; j <= 100 ; j ++) { if(j == 0) f[i][j] = BigInteger.ONE; else f[i][j] = BigInteger.ZERO; } F[0] = BigInteger.ONE; for(int i = 1 ; i <= 100 ; i++) F[i] = F[i-1].multiply(BigInteger.valueOf(i)); for(int i = 1 ; i <= 100 ; i ++) { for(int j = 1 ; j <= i ; j ++) { f[i][j] = f[i-1][j].add(f[i][j-1]); } } int n , m; int CASE = 1; while(cin.hasNext()) { n = cin.nextInt(); m = cin.nextInt(); if(n == 0 && m == 0) break; System.out.printf("Test #%d:\r\n",CASE++); System.out.println(f [m].multiply(F ).multiply(F[m])); } } }
相关文章推荐
- java学习——函数
- Java工程师成神之路~
- java使用poi解析2007以上的word文档中的表格与图片
- Eclipse 提交至Git@OSC
- Eclipse 3.7如何安装egit
- java项目命名规则
- eclipse classic添加html之类的web插件
- Eclipse中提高Android SDK Manager下载速度方法
- OGNL和Struts2标签
- spring-session源码解读-3
- tiles3 基础使用及与spring mvc集成
- SpringMVC 拦截器(不过滤某个路径)
- java中将json转换成map
- Struts2.properties属性文件中的devModel和DynamicMethodInvocation。。。Action中servlet对象的获取
- Struts2中使用Servlet API步骤
- java设计模式(五)—命令模式
- Ant之Task
- Java的一些小知识:package,import,不同目录下类的调用
- Java动态代理原理
- 三个例子讲清楚Java反射