根据一道题的算法发现自己的思维局限性

题:有12大小相同颜色相同的球,有一颗球重量不同,有一个天平,最尽量少的次数测出哪颗球有问题,有问题的球相对于其它球是重还是轻!

发现思维局限的由来:这道题我之前想法是天平将球6:6称,2:2的称,1:1,这几种是人常规思维,和我一样,后面又想到2:10、3:9、4:8这几种,因为后面数是前面数的倍数,我想通过这个关系来找,想起来只有天平, 没有砝码,看不到具体的倍数关系,只能看到天平左边倾斜还是右边,就放弃了这几种想法,研究前面的3中,发现6:6分的时候,我可以再拆开3:3的,这时候有人提出了一种想法,我理解起来也有点费事,磨了半天的时间理顺了想通了的过了几遍才发现自己的思维的局限在哪,所以接下来我先叙述我推崇的他这种算法:

第一步:将球标号1-12号球,分为三堆,我们就分为1-4、5-8、9-12,将任意两堆放到天平左右两边,假设我左边放1-4,右边放5-8,剩下9-12

第二步:看天平两边是否平衡,如果平衡说明了问题的球在第三堆(思维局限1:只关注天平两端,剩下的也是信息

第三步:这下好解决了,这里就简单了,你可以拿1-8任意一球来和这四颗称,最坏的情况是你这样称了三次,三次天平还平衡第四颗是有问题的,想要知道重量在称一次

还有一种,任意拿两颗标准球来和这四颗中任意两球比,看天平平衡来确定

还有一种,任意拿三颗标准球来和这四颗球中的任意两颗球来对比----->结束

第四步:第二步中天平不平衡而引发的问题,如果左边1-4>右边5-8(>代替左边重,代表天平哪边更低,这里有人会犯迷糊,左重右只能说明这八颗球中有问题球,有可能是在左边,那这颗球是重的,有可能在右边,那这颗球是轻的),将左边中随意拿出去3颗球放出去(假如拿出去的球是2-4),将右边盘随机拿3个球放左边盘上(假如是6-8),右盘上放三个标准球,这样有三种情况(左>右、左<右、左==右)下面依次来分析(局限思维2:在第四步中说明问题球在1-8中,却敢将其中有可能是答案的球抛出去

第五步:左==右:说明6-8和拿来的三个标准器是相同的,说明了两点问题:在拿出去的三颗球(2-4)中,且问题球是重的,3颗球好解决了,按第三步的来-->结束

第六步:左>右:没有拿出去2-4左>右,拿出去换了球还是左>右,说明问题出在1和5身上,用标准球测-->结束

第七步:左<右:天平倾斜方向变了,说明了两点问题:问题球在6-8中,且问题球是轻的--->

第八步:还没测出来重复第四步,>换做< -->解决

总结:思维过于僵硬,即使别人说出来还要多请教两次才能弄懂

代码:附在最后

优点:运行效率高

缺点:编程效率太低了

第二种方法:常规,将球分为4个3,分别3:3称

优点:编程效率大大高于上面的方法

缺点:运行效率要比上面的方法小一点

时间: 2024-10-04 22:30:55

根据一道题的算法发现自己的思维局限性的相关文章

学习日志---Apriori算法发现频繁集

发现dataSet的频繁集: import numpy as np import pandas as pd def loadDataSet():     return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] #提取数据集中所有的单独数据,参数是数据集 def createC1(dataSet):     C1 = []     for transaction in dataSet:         for item in transaction:

FP-growth算法发现频繁项集(二)——发现频繁项集

上篇介绍了如何构建FP树,FP树的每条路径都满足最小支持度,我们需要做的是在一条路径上寻找到更多的关联关系. 抽取条件模式基 首先从FP树头指针表中的单个频繁元素项开始.对于每一个元素项,获得其对应的条件模式基(conditional pattern base),单个元素项的条件模式基也就是元素项的关键字.条件模式基是以所查找元素项为结尾的路径集合.每一条路径其实都是一条前辍路径(perfix path).简而言之,一条前缀路径是介于所査找元素项与树根节点之间的所有内容. 下图是以{s:2}或{

【BZOJ2229】【ZJOI2011】最小割 {没有错,这道题的算法跟题帽是一样的!!!}

题解:分治求最小割. [l--r]里任意找两个作为s.t(不妨把s设为l位置上的点,t设为r位置上的点)求最小割,两层for循环枚举修改map[i][j]即两点间最小割值. 然后一部分属于S集,一部分属于T集,分治[l,L],[R,r],每次求完最小割值都全局进行修改. 最后每次询问暴力做就好了,无需任何优化即可AC. 代码: #include <queue> #include <cstdio> #include <cstring> #include <iostr

学习日志---FP-growth算法发现频繁集

作者:peter harrington,确实牛B!!! 构建FP树,实现频繁集挖掘 class treeNode:     def __init__(self, nameValue, numOccur, parentNode):         self.name = nameValue         self.count = numOccur         self.nodeLink = None         self.parent = parentNode      #needs t

hdu 5284 wyh2000 and a string problem(没有算法,只考思维,字符数组得开20万,不然太小了)

代码: #include<cstdio> #include<cstring> using namespace std; char s[200000]; int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",s); int w=0,y=0,h=0; int len=strlen(s); for(int i=0; i<len; i++) { if(w==0&&

Codeforces Round #263 (Div. 2)C(贪心,联想到huffman算法)

数学家伯利亚在<怎样解题>里说过的解题步骤第二步就是迅速想到与该题有关的原型题.(积累的重要性!) 对于这道题,可以发现其实和huffman算法的思想很相似(可能出题人就是照着改编的).当然最后只是输出cost,就没必要建树什么的了.只要理解了huffman算法构造最优二叉树的思路,就按那么想就知道每个a[i]要加多少次了. 当然这道题没想到这些也可以找出规律的,就是一种贪心思想. #include<iostream> #include<cstdio> #include

彻底搞懂最短路算法

转载自:戳 彻底弄懂最短路径问题 只想说:温故而知新,可以为师矣.我大二的<数据结构>是由申老师讲的,那时候不怎么明白,估计太理论化了(ps:或许是因为我睡觉了):今天把老王的2011年课件又看了一遍,给大二的孩子们又讲了一遍,随手谷歌了N多资料,算是彻底搞懂了最短路径问题.请读者尽情享用…… 我坚信:没有不好的学生,只有垃圾的教育.不过没有人理所当然的对你好,所以要学会感恩. 一.问题引入 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径.解决

《转》八大算法详细讲解

转自http://blog.csdn.net/jobbofhe/article/details/51426934 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短:

支持向量机(SVM)算法

支持向量机(support vector machine)是一种分类算法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的.通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解. 具体原理: 1. 在n维空间中找到一个分类超平面,将空间上的点分类.如下图是线性分类的例子. 2. 一般而言,一个点距离超平面的