1.这是一个翻烙饼的问题:
一个饭馆的服务员,在每次客户点了烙饼的时候,
都会把烙饼按下面最大上面最小的顺序摆放好,由
于一只手托着盘子里的烙饼,只能用另一只手一次
抓住最上面的几个烙饼进行翻个儿。
求最优的翻烙饼方法(翻的次数最少)[详见《程序之美》]
2.建模:
书上给的算法没看懂,不过我觉得这个也可以实现,但肯定不是最优的。
每次翻转的时候的目标都是最大的烙饼,第一次先把最大的烙饼翻个儿到最上面,
然后再把它翻个到最下面,这样就完成了一个烙饼的翻个,接下来重复下面的N-1
个烙饼,直到全部翻转完成。
public class Flapjack {
private static int[] arr = { 1, 4, 6, 8, 45, 2, 3, 9, 5, 6, 12, 4, 56, 7 };
private static int revertCount;
/**
* isSorted 是否已排序好
*
* @param arr
* @return
*/
private static boolean isSorted() {
for (int i = 1; i < arr.length; i++) {
if (arr[i - 1] > arr[i])
return false;
}
return true;
}
/**
* getMaxItemIndex 获取数组中最大项的索引
*
* @param end
* @return
*/
private static int getMaxItemIndex(int end) {
if (end > arr.length)
throw new ArrayIndexOutOfBoundsException();
int temp = arr[0];
int index = 0;
for (int i = 1; i < end; i++) {
if (temp < arr[i]) {
temp = arr[i];
index = i;
}
}
return index;
}
/**
* revert 翻转
*
* @param begin
* @param end
*/
private static void revert(int begin, int end) {
if (begin > end || end > arr.length - 1 || begin < 0)
return;
for (int iBegin = begin, iEnd = end; iBegin < iEnd; iBegin++, iEnd--) {
int temp = arr[iBegin];
arr[iBegin] = arr[iEnd];
arr[iEnd] = temp;
}
revertCount++;
}
/**
* 排序主函数
*
* @param len
*/
public static void sort(int len) {
if (isSorted())
return;
int maxIndex = getMaxItemIndex(len);
revert(0, maxIndex);
revert(0, len - 1);
if (len <= 0)
return;
sort(len - 1);
}
/**
* 打印
*/
public static void print() {
System.out.print("[");
for (int i = 0; i < arr.length; i++)
if (i == arr.length - 1)
System.out.print(arr[i]);
else
System.out.print(arr[i] + ",");
System.out.print("]");
System.out.println("翻转次数:" + revertCount);
}
/**
* 测试
*/
public static void main(String[] args) {
System.out.println("排序前:");
Flapjack.print();
sort(arr.length);
System.out.println("排序后:");
Flapjack.print();
}
}
如有更好的算法,欢迎讨论。
分享到:
相关推荐
每次翻转操作意味着选择烙饼堆中的任意一个烙饼作为顶部,然后将这个烙饼及其以下的所有烙饼整体翻转过来,类似于煎饼翻面的过程。 ### 算法实现 在C语言中实现翻转烙饼排序,涉及到的关键步骤包括: 1. **寻找...
今天我们要探讨的是一个既亲切又富有挑战性的数学问题——烙饼问题,以及如何利用优化策略来找到解决这一问题的最节省时间的方法。 《数学广角优化烙饼问题》这份课件,旨在通过一系列精心设计的数学活动,培养中...
《程序之美-C语言:烙饼排序算法与买书问题源码》 在计算机科学的世界里,算法是解决问题的关键。本文将深入探讨两个编程问题:烙饼排序算法和买书问题,这两个问题都涉及到C语言的高效实现。我们将通过源代码分析...
"烙饼问题",也被称为"煎饼问题"或"三明治问题",是计算机科学中的一个经典问题,属于算法优化的范畴。这个问题源于生活中的实际情况:在平底锅中,每次只能同时烙两张饼,饼需要烙两面,每面需要相同的时间。其目标...
《烙饼问题11-2.ppt》是一个探讨优化算法的经典问题,主要涉及数学和计算机科学中的调度理论。这个问题的核心是找到在有限资源下完成任务的最有效策略,特别是当资源(在这里是平底锅)只能处理有限数量的任务时。在...
《烙饼问题》是数学领域中一个引人入胜的优化问题,它不仅考验着我们的逻辑思维能力,还教会我们如何在有限资源下高效利用时间。在现实生活中,时间是一种宝贵的资源,如何合理规划和使用时间,往往决定了我们能否在...
《烙饼问题》是数学中的一个经典问题,它属于优化问题的一个范畴,旨在寻找最有效率的方法来完成特定任务。在这个问题中,我们探讨的是如何在最短的时间内烙制一定数量的饼,同时充分利用煎饼锅的烹饪能力。下面我们...
【数学广角—烙饼问题】是小学四年级数学课程中的一个重要知识点,主要涉及的是优化问题,即如何在有限条件下以最有效的方式解决问题。在这个教学设计中,教师以烙饼的过程为例,引导学生探讨如何合理安排操作以节省...
【华为OJ烙饼排序】是华为在线测评平台(OpenJudge)上的一道高级编程题目,...通过实践烙饼排序,不仅可以掌握排序算法的基本原理,还能锻炼对复杂问题的分解和抽象能力,这对于成为一名优秀的IT专业人士至关重要。
《烙饼问题》是小学数学中的一个重要概念,它属于运筹学的范畴,旨在通过合理的规划和安排,达到最优化的时间利用。这个问题的核心是解决在有限的资源和条件下,如何高效地完成一系列任务。 首先,我们要理解烙饼...
《烙饼问题》作为教学案例,旨在通过数学优化思想解决现实问题,帮助学生在动手实践中体验运筹学的应用,激发他们寻找最优解的意识和能力。 首先,教师在课堂上创设了烙饼问题的活动情境。不同于直接讲授理论,这种...
《烙饼问题》是数学广角中的一节课,主要探讨如何高效地利用资源解决实际问题,特别是涉及到时间管理和优化策略的运用。这节课的核心知识点包括运筹思想、问题解决策略的多样性、寻找最优方案以及数学在日常生活中的...
《烙饼问题》是数学中一个经典的优化问题,主要探讨如何高效地利用有限的资源来完成一系列任务。在这个问题中,我们关注的是如何在一只锅里烙饼,每次可以烙固定数量的饼,并且每面都需要一定时间才能熟。通过解决这...
"烙饼问题",也被称为"煎饼翻转问题",是计算机科学和数学中一个经典的时间优化问题,源于日常生活中的烹饪场景。该问题的基本设定是:在一个只能同时烙两张饼的平底锅中,每张饼需要正反两面各烙一次,每次烙一面...
1. **最优化策略**:烙饼问题的核心是寻找最高效的烹饪方法,以最少的时间满足所有人的需求。在这个案例中,关键在于如何安排三张饼的烙制顺序,使得总的烙饼时间达到最短。对于三张饼的情况,最佳策略是先烙前两张...
数学广角中的“烙饼问题”,也被称为“煎饼问题”或“烤饼问题”,是运筹学中的一个经典问题,通常用于教授优化策略和问题解决技巧。在这一问题中,我们考虑如何在最短的时间内用一个平底锅烙完一定数量的饼,每次锅...
《数学广角合理烙饼问题》正是这样一个典型的例子,它将日常生活中的一个简单动作——烙饼,转化为了一道需要精心设计策略才能解决的优化问题。在这一过程中,我们必须考虑到时间管理和资源利用这两个关键因素。 ...
1. **烙饼问题**:烙饼问题是一种经典的优化问题,通常出现在小学数学的教学中,旨在训练学生的逻辑思维和优化策略。在这个问题中,每次只能同时烙两张饼,每面需要烙3分钟,目标是找到最短的时间来烙制一定数量的饼...
解决烙饼问题的关键在于“交替翻煎”。具体步骤如下: 1. 将两张煎饼放入平底锅,烙第一面,用时3分钟。 2. 取出已熟一面的煎饼,将另一面未熟的煎饼翻过来继续烙,同时将第三张煎饼放入锅中烙第一面,再用3分钟。 3...
然而,在数学的世界里,烙饼问题却摇身一变,成为了一个充满挑战的优化问题。通过《数学广角合理烙饼问题》这一课程的学习,我们不难发现数学与日常生活之间的紧密联系,以及数学在解决实际问题中的巨大作用。 首先...