蓝桥杯 出栈次序(java题解)
2016-08-16 11:46
302 查看
X星球特别讲究秩序,所有道路都是单行线。一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
思路:知道卡特兰数的这题可以直接推导出来。不知道也没关系。稍微分析一下也简单。求出栈次序,无非就是问一共有多少种满足要求的排列,满足条件在本题中就是指,只有站中有“车”,才能够出来。假设1,代表进站,0代表出站,出站符合要求的就是指NUM(1)>=NUM(0)。最后生成的01排列就是总数。
方法一:按照逻辑求解,运用递归,耗时较长,约22秒
代码:
方法二:根据车数递增,可能的次序数满足Catalan数,用Catalan数公式求解
代码:
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图【p1.png】所示。 X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。 如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种? 为了方便起见,假设检查站可容纳任意数量的汽车。 显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。 现在足足有16辆车啊,亲!需要你计算出可能次序的数目。
思路:知道卡特兰数的这题可以直接推导出来。不知道也没关系。稍微分析一下也简单。求出栈次序,无非就是问一共有多少种满足要求的排列,满足条件在本题中就是指,只有站中有“车”,才能够出来。假设1,代表进站,0代表出站,出站符合要求的就是指NUM(1)>=NUM(0)。最后生成的01排列就是总数。
方法一:按照逻辑求解,运用递归,耗时较长,约22秒
代码:
import java.util.*; public class Main { public static int count = 0; public static int n = 0; public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); List<String> a = new ArrayList<String>(); for(int i=1; i<=n; i++) { a.add(i + ""); } f(a, new ArrayList<String>(), new ArrayList<String>()); System.out.println(count); in.close(); } public static void f(List<String> a, List<String> b, List<String> c) { if(c.size() == n) { count ++; return; } if(b.size() == 0) { List<String> b1 = new ArrayList<String>(b);//用新的List传递 List<String> a1 = new ArrayList<String>(a); b1.add(a1.get(a1.size()-1)); a1.remove(a1.size()-1); f(a1, b1, c); return; } if(a.size() == 0) { List<String> b1 = new ArrayList<String>(b); List<String> c1 = new ArrayList<String>(c); c1.add(b1.get(b1.size()-1)); b1.remove(b1.size()-1); f(a, b1, c1); return; } List<String> a1 = new ArrayList<String>(a); List<String> b1 = new ArrayList<String>(b); b1.add(a1.get(a1.size()-1)); a1.remove(a1.size()-1); f(a1, b1, c); List<String> b2 = new ArrayList<String>(b); List<String> c2 = new ArrayList<String>(c); c2.add(b2.get(b2.size()-1)); b2.remove(b2.size()-1); f(a, b2, c2); } }
方法二:根据车数递增,可能的次序数满足Catalan数,用Catalan数公式求解
代码:
public class Main { public static void main(String[] args) { int num = 1; for(int i=1;i<=16;i++) { num = num*(4*i-2)/(i+1); } System.out.println(num); } }
相关文章推荐
- 蓝桥杯真题 出栈次序 题解
- 蓝桥杯 未名湖畔的烦恼(java题解)
- 蓝桥杯 Torry的困惑(基本型)(java题解)
- 第五届蓝桥杯软件类国赛真题-C-B-2_出栈次序
- 2018第九届蓝桥杯JAVA C组 第三题 字母阵列 题解
- 蓝桥杯---出栈次序
- 第五届蓝桥杯决赛C\C++B组——出栈次序
- 蓝桥杯 字母图形(java题解)
- 蓝桥杯 生物芯片(java题解)
- 蓝桥杯 Anagrams问题(java题解)
- 蓝桥杯 从我做起振兴中华(java题解)
- 蓝桥杯 最大最小公倍数(java题解)
- 蓝桥杯 排列数(java题解)
- 蓝桥杯 区间K大数查询(java题解)
- 蓝桥杯 数字三角形(java题解)
- 第五届蓝桥杯决赛 第二题 出栈次序(catalan数)
- 蓝桥杯 黄金连分数(java题解)
- 蓝桥杯第七届决赛真题大全题解(java版本)
- 蓝桥杯 日期计算(java题解)
- 蓝桥杯 黄金连分数(java题解)