书中的题目描述:
星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:
“我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。
我后来想,这实际上是个有趣的排序问题:假设有n块大小不一的烙饼,那最少要翻几次,才能达到最后大小有序的结果呢?
你能否写出一个程序,对于n块大小不一的烙饼,输出最优化的翻饼过程呢?
分析与解法
这个排序问题非常有意思,首先我们要弄清楚解决问题的关键操作——“单手每次抓几块饼,全部颠倒”。
每次我们只能选择最上方的一堆饼,一起翻转。而不能一张张地直接抽出来,然后进行插入,也不能交换任意两块饼子。这说明基本的排序办法都不太好用。那么怎么把这n个烙饼排好序呢?
由于每次操作都是针对最上面的饼,如果最底层的饼已经排序,那我们只用处理上面的n-1个烙饼。这样,我们可以再简化为n-2、n-3,直到最上面的两个饼排好序。
具体可见附件电子书
用javascript实现下:演示@google code
不要用ie折磨自己了,chrome最快,ff勉强
<script type="text/javascript">
Array.prototype.clone=function(){
return this.slice(0,this.length);
};
function FlapJack(arr){
this._original=arr;
//工作数组,会经常变化的
this._work=arr.clone();
//最终有序数组
this._result=[];
//最优翻转步鄹
this._reverseStep=[];
//记录枚举状态的中间翻转步鄹
this._workReverseStep=[];
//总共调用了多少次search操作
this._totalSearchCount=0;
//初始上限,最多2.(n-1)次翻转可以有序
this.maxStep=2*(arr.length-1);
}
FlapJack.prototype.run=function(){
this.search(0);
};
FlapJack.prototype.search = function(step){
this._totalSearchCount++;
//当前工作数组达到有序的最少翻转此数
var nEstimate = this.lowerBound(this._work);
//已经超过当前上限,忽略,剪枝
if(nEstimate + step > this.maxStep || step >= this.maxStep) return;
//已经完成要求有序
if(this.isSorted(this._work)) {
//当前步鄹为最优,记录当前步鄹详情
if(step < this.maxStep) {
this.maxStep = step;
this._reverseStep=this._workReverseStep.slice(0,step);
this._result=this._work.clone();
return;
}
}
//枚举搜索
for(var i=1;i<this._work.length;i++) {
//0...i 翻转
this.reverse(this._work,0,i);
//记录翻转步鄹
this._workReverseStep[step]=i;
//继续枚举搜索
this.search(step+1);
//还原继续搜索
this.reverse(this._work,0,i);
}
};
FlapJack.prototype.isSorted=function(arr) {
for(var i = 1; i < arr.length; i++){
if(arr[i-1] > arr[i]) {
return false;
}
}
return true;
};
//下界计算,凡是有两个位置相邻尺寸不相邻的都需要至少一次翻转将它们分开
FlapJack.prototype.lowerBound=function(arr){
var ret=0;
for(var i=1;i<arr.length;i++) {
if(Math.abs(arr[i]-arr[i-1])!=1)
ret++;
}
return ret;
};
//
FlapJack.prototype.reverse = function(arr,begin,end) {
var i=begin,
j=end,
t=0;
for(;i<j;i++,j--) {
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
};
if(!window['consoleH']) {
consoleH={
log:function(msg){
document.writeln(msg+"<br />");
//alert(msg);
}
};
}
(function main(){
var fj=new FlapJack([3, 2, 1, 6, 5, 4 ,9, 8 ,7, 0]);
fj.run();
consoleH.log("初始结果 [ "+[3, 2, 1, 6, 5, 4 ,9, 8 ,7, 0]+" ]");
consoleH.log("搜索次数 "+fj._totalSearchCount);
consoleH.log("最终有序结果 [ "+fj._result+" ]");
consoleH.log("最优翻转次数 "+fj.maxStep);
consoleH.log("最优翻转步鄹 "+fj._reverseStep);
})();
</script>
- 大小: 1.4 KB
分享到:
相关推荐
【华为OJ烙饼排序】是华为在线测评平台(OpenJudge)上的一道高级编程题目,主要考察的是排序算法的应用和实现。烙饼排序(Flipping Sorting),也称为煎饼排序,是一种基于比较的排序算法,它的灵感来源于煎饼翻转...
《程序之美-C语言:烙饼排序算法与买书问题源码》 在计算机科学的世界里,算法是解决问题的关键。本文将深入探讨两个编程问题:烙饼排序算法和买书问题,这两个问题都涉及到C语言的高效实现。我们将通过源代码分析...
翻转烙饼排序问题是一种经典的计算机科学问题,其核心是在一系列烙饼中通过翻转操作将烙饼按大小顺序排列。这个问题在计算机科学领域中,尤其是算法设计与分析、数据结构以及人工智能等领域有着广泛的应用。下面,...
在数学教育领域,将实际问题抽象化并以此作为教学案例是常见的教学方法之一。《烙饼问题》正是这样一个将实际生活中的烙饼操作转化为数学问题的案例,它不仅能够让学生在解决实际问题的过程中掌握数学知识,还能够...
2. **数学模型**:烙饼问题可以抽象为一个数学模型,其中饼数代表问题规模,每次可烙饼的数量作为限制条件,每面烙的时间是固定参数。通过这个模型,我们可以找出解决不同数量饼的最优解。 3. **递推关系**:饼数与...
1. **烙饼问题**:烙饼问题是一种经典的优化问题,通常出现在小学数学的教学中,旨在训练学生的逻辑思维和优化策略。在这个问题中,每次只能同时烙两张饼,每面需要烙3分钟,目标是找到最短的时间来烙制一定数量的饼...
【知识点详解】 1. **烙饼问题**:烙饼问题是一种经典的优化问题,通常涉及到在有限的...理解这些知识点有助于培养学生的逻辑思维能力,提高他们面对实际问题时的解决能力,并引导他们将数学知识应用于日常生活之中。
今天我们要探讨的是一个既亲切又富有挑战性的数学问题——烙饼问题,以及如何利用优化策略来找到解决这一问题的最节省时间的方法。 《数学广角优化烙饼问题》这份课件,旨在通过一系列精心设计的数学活动,培养中...
本资料主要涉及的是四年级数学中的“烙饼问题”,这是一个经典的优化问题,旨在教授学生如何在有限的条件下高效地完成任务。烙饼问题通常与时间管理和效率优化有关,是运筹学的一个简单实例,对于培养孩子的逻辑思维...
烙饼问题与时间复杂度分析 在这个文件中,我们可以看到一个经典的烙饼问题,它是计算机科学中一个著名的例子,用于说明时间复杂度的概念。下面我们将详细解释这个问题的解决方案和相关的知识点。 首先,让我们了解...
《四年级上册数学广角:烙饼问题》 在人教版四年级上册的数学广角课程中,我们探讨了一个有趣的实际问题——烙饼问题。这个问题涉及到优化时间管理和效率提升,对于培养学生的逻辑思维和解决问题的能力具有重要意义...
《129烙饼问题》是人教版四年级上册第七单元的一个数学问题,主要探讨如何高效地利用有限的资源解决实际问题。这个题目涉及到了优化策略和时间管理的概念,对于孩子们来说,是一个很好的实践应用例子。 首先,我们...
《烙饼问题》的教学课例主要探讨的是如何运用优化思维解决实际问题,特别是通过烙饼这一日常生活中的例子,让学生理解并初步体验运筹思想和对策方法。运筹思想是一种数学策略,它涉及到在多种可能的解决方案中寻找...
优化烙饼问题 通过这节课,我们可以学习到数学广角——优化烙饼问题的思想。优化烙饼问题是指在烙饼时,如何通过合理的安排来节约时间和能源。我们可以通过简单的实例,初步体会运筹思想在解决实际问题中的应用。 ...
例如,在多线程编程中,如何分配和管理资源以最大化并发执行的任务数,从而提高程序的运行效率,就与烙饼问题的解决思路相类似。 此外,烙饼问题还可以帮助我们理解动态规划的思想。动态规划是一种通过将大问题分解...
它通过将日常生活中烙饼的过程转化为数学模型,让学生在解决实际问题的过程中,体会到数学之美和实用性。 “合理烙饼问题”指的是在有限的资源下,如何在最短的时间内烙制出最多的饼。这个问题虽然简单,却能巧妙地...
《四年级数学上册8数学广角_优化8.2烙饼问题教学反思素材新人教版》这篇教学反思聚焦于小学四年级数学课程中的一个重要概念——优化问题,特别是以“烙饼问题”为实例的教学实践。这个课题旨在引导学生理解和应用...
标签中的“烙饼问题”是一种经典的排序问题,也被称为煎饼排序。在这个问题中,想象一个平底锅可以同时煎两张饼,而我们要对多张饼进行排序,每次只能翻转一张或两张饼。烙饼问题展示了如何在有限的操作下达到目标...
1. **统筹思想**:在烙饼问题的教学中,统筹思想是一个核心概念。它是指在处理问题时,通过合理规划和安排,以达到最高效、最节省资源的结果。在这个问题中,学生需要理解如何在有限的条件下(每次只能烙两张饼)...
这篇PPT主要探讨了在数学问题中如何有效地利用时间和资源,特别关注了“烙饼问题”。烙饼问题是一个经典的优化问题,它源自于日常生活中的烹饪活动,旨在寻找最小化完成任务所需时间的方法。在这个问题中,每次只能...