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...
《数学广角合理烙饼问题》是一门课程,旨在教授如何高效解决数学中的优化问题,特别是涉及时间管理和资源利用的问题。在这个课件中,我们关注的是一个经典的数学问题,即如何在最少的时间内烙制一定数量的饼,每个饼...
《四年级数学上册数学广角烙饼问题》是一份专为四年级学生设计的数学教学资源,旨在通过“烙饼问题”引导学生理解和应用优化思想。这个问题涉及到时间管理和效率优化,是数学中的一个经典应用题型。 在这个问题中,...
这份小学四年级上册的数学广角优化烙饼问题PPT学习教案主要讲解了如何高效地解决实际生活中的优化问题,特别是与烹饪相关的数学问题。其中的核心知识点包括: 1. **交替烙饼法**:当锅只能同时烙两张饼时,为了最大...