第6届蓝桥杯javaA组第7题,牌型种数,一道简单的题带来的思考
题目:
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
拿到这道题的时候第一时间想到了解决方案:dfs。
但是我在编写第一版的时候出现了很大的问题,导致算法复杂度为O(n^n),当然,这道题目里面的n自然就是13了。
我的想法是:从第一张牌开始取,一直取到第13张,而每一次取牌呢,是在13种牌里面遍历,用一个数组记录每一种牌目前被取了多少,在遍历中看这个牌被取得数目是不是大于4,是的话就不取这张牌。
然而这么做直接导致13的循环里面每一次都有13种可能,再加上排列组合,一共13^13种需要遍历。
代码如下:
import java.util.Arrays;
public class Main_1 {
public static void main(String[] args) {
Solution s = new Solution();
int[] numStates = new int[13];
s.recurse(0, numStates);
System.out.println(s.allPos);
}
}
class Solution {
int allPos = 0;
public void recurse(int curStep, int[] numStates) {
if(curStep == 13) {
allPos++;
System.out.println(Arrays.toString(numStates));
}
else {
for(int i = 2; i < 15; i++) {
if(numStates[i - 2] < 4) {
numStates[i - 2]++;
recurse(curStep + 1, numStates);
numStates[i - 2]--;
}
}
}
}
}
第一版的直接运行结果是半天没有反应,我一开始以为它陷入死循环了,结果用“System.out.println(Arrays.toString(numStates));”一看,发现一直在跑,但是过于复杂了。
我看到这个结果以为不能用暴力法破解,然后去网上看看别人的做法,发现有人用暴力法成功了,我大致看了别人的代码之后发现我的问题可能出自暴力法之中。
第二版我的想法是:还是递归13次,不过这次递归的是每一种牌的取得个数。也就是在13次的递归之中,每一次研究当前这种牌能取多少(具体一点就是比如说该考虑8这张牌了,那么有5种可能,从一张不拿到四张全拿),当递归次数达到13时,直接比较当前牌的总数是不是13。当然优化的方法是直接把另外一个条件也作为结束递归的标志:“目前的牌的总数大于了13,那么之后就算全部不取都无法满足条件”。算法复杂度是O(5^n),这道题目里面n = 13;
代码如下:
public class Main_2 {
public static void main(String[] args) {
Solution_2 s = new Solution_2();
s.getResult(0, 0);
System.out.println(s.num);
}
}
class Solution_2 {
public int num = 0;
public void getResult(int curSum, int curStep) {
if(curStep == 13 || curSum > 13) {
if(curSum == 13)
num++;
}
else {
for(int i = 0; i <= 4; i++) {
getResult(curSum + i, curStep + 1);
}
}
}
}
这道题目给我的思考是,在用暴力法的时候直接多想几种可能,多想几种优化方案,这样可以很大程度上节约时间
第6届蓝桥杯javaA组第7题,牌型种数,一道简单的题带来的思考的更多相关文章
- 第九届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多 ...
- 第六届蓝桥杯JavaA组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...
- 第六届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.熊怪吃核桃 题目描述 森林里有一只熊怪,很爱吃核桃.不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份.如果不能等分, ...
- 第七届蓝桥杯JavaA组国(决)赛部分真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.阶乘位数 阶乘位数 9的阶乘等于:362880 它的二进制表示为:1011000100110000000 这个数字共有19位. 请你计 ...
- 第七届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...
- 2018年第九届蓝桥杯B组题C++汇总解析-fishers
2018年第九届蓝桥杯B组题C++解析-fishers 题型 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 ...
- 第十届蓝桥杯JavaB组省赛真题
试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...
- 2015年第六届蓝桥杯JavaB组省赛试题解析
题目及解析如下: 题目大致介绍: 第一题到第三题以及第六题.第七题是结果填空,方法不限只要得到最后结果就行 第四题和第五题是代码填空题,主要考察算法基本功和编程基本功 第八题到第十题是编程题,要求编程 ...
- 第十届蓝桥杯JavaB组总结
去年参加了第九届蓝桥杯C/C++B组,很捞,做了大概5道题,就好像就做对了2道结果填空题,编程题只做了一个(只通过了部分测试数据),最后拿了个省三,但是班上那些平时没有认真准备的都拿了省二 今年想好好 ...
随机推荐
- wireshark过滤语法总结
抓包采用wireshark,提取特征时,要对session进行过滤,找到关键的stream,这里总结了wireshark过滤的基本语法,供自己以后参考.(脑子记不住东西) wireshark进行过滤时 ...
- android studio 中 .9.png的制作
折腾好久,最后在一个群里面咨询一个朋友才弄好的,用的是1.2.2版,感觉对.9的支持不太好, 1,用一张干净的png图片放在mipmap里面. 2,点击图片右键最后一项,create 9-patch ...
- Samsung I9103刷cm-10.1的方法
按照官方网站的说明一步一步的做下去的时候发现在执行heimdall.exe文件的时候出现“不是win32的应用程序”的错误提示,因此决定按照其它方法安装recovery,然后再刷入CM10.1. sa ...
- js函数命名常用动词
get 获取/set 设置, add 增加/remove 删除 create 创建/destory 移除 start 启动/stop 停止 open 打开/close 关闭, read 读取/writ ...
- Broadmann分区
来源: http://blog.sina.com.cn/s/blog_60a751620100k2hj.html Brodmann areas Name 中文名 Function 1 Somatose ...
- 039医疗项目-模块四:采购单模块—采购单的创建-----------Dao层,service层,Acion层
我们根据数据库里面的表格:生成对应的Mapper接口文件和...Mapperxml文件: YYCGD:采购单模板表. YYCGD2014:采购单动态生成表,由存储过程生成. YYCGDMX:采购单明细 ...
- [转]Linux日志文件总管——logrotate
FROM : https://linux.cn/article-4126-1.html 日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到.对于忙碌的服务器,日志文 ...
- IE6/IE7/IE8/Firefox/Chrome/Safari的CSS hack兼容一览表
浏览器兼容问题一直是前段开发工程师比较头痛的问题,熟悉了里面的规则也就变得简单了,这里有一份资料可以分享给大家,大家平时开发过程中遵循这个规律的话,会变得轻松多了: 各浏览器CSS hack兼容表: ...
- Oracle 11g Express
Oracle 11g Express 安装和使用教程 使用工具的第一步就是安装工具,配置环境!下面就Oracle 11g Express的安装和简单实用做一简介. 一.下载安装过程 去oracle ...
- JavaScript 位运算总结&拾遗
最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...