`
ol_beta
  • 浏览: 289409 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

翻烙饼问题

阅读更多

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语言源码)

    每次翻转操作意味着选择烙饼堆中的任意一个烙饼作为顶部,然后将这个烙饼及其以下的所有烙饼整体翻转过来,类似于煎饼翻面的过程。 ### 算法实现 在C语言中实现翻转烙饼排序,涉及到的关键步骤包括: 1. **寻找...

    烙饼排序算法和买书问题源码

    《程序之美-C语言:烙饼排序算法与买书问题源码》 在计算机科学的世界里,算法是解决问题的关键。本文将深入探讨两个编程问题:烙饼排序算法和买书问题,这两个问题都涉及到C语言的高效实现。我们将通过源代码分析...

    烙饼问题 (4).ppt

    "烙饼问题",也被称为"煎饼问题"或"三明治问题",是计算机科学中的一个经典问题,属于算法优化的范畴。这个问题源于生活中的实际情况:在平底锅中,每次只能同时烙两张饼,饼需要烙两面,每面需要相同的时间。其目标...

    烙饼问题11-2.ppt

    《烙饼问题11-2.ppt》是一个探讨优化算法的经典问题,主要涉及数学和计算机科学中的调度理论。这个问题的核心是找到在有限资源下完成任务的最有效策略,特别是当资源(在这里是平底锅)只能处理有限数量的任务时。在...

    烙饼问题(1).ppt

    《烙饼问题》是数学中的一个经典问题,它属于优化问题的一个范畴,旨在寻找最有效率的方法来完成特定任务。在这个问题中,我们探讨的是如何在最短的时间内烙制一定数量的饼,同时充分利用煎饼锅的烹饪能力。下面我们...

    数学广角—烙饼问题教学设计.doc

    【数学广角—烙饼问题】是小学四年级数学课程中的一个重要知识点,主要涉及的是优化问题,即如何在有限条件下以最有效的方式解决问题。在这个教学设计中,教师以烙饼的过程为例,引导学生探讨如何合理安排操作以节省...

    华为oj烙饼排序

    【华为OJ烙饼排序】是华为在线测评平台(OpenJudge)上的一道高级编程题目,...通过实践烙饼排序,不仅可以掌握排序算法的基本原理,还能锻炼对复杂问题的分解和抽象能力,这对于成为一名优秀的IT专业人士至关重要。

    《烙饼问题》 (3).ppt

    《烙饼问题》是小学数学中的一个重要概念,它属于运筹学的范畴,旨在通过合理的规划和安排,达到最优化的时间利用。这个问题的核心是解决在有限的资源和条件下,如何高效地完成一系列任务。 首先,我们要理解烙饼...

    烙饼问题教学设计及反思.doc

    《烙饼问题》的教学设计与反思主要关注如何利用数学优化思想解决实际问题,特别是通过解决烙饼的问题,培养学生的逻辑思维能力和解决问题的能力。本教学活动旨在让学生体验运筹学的概念,理解优化思想,并掌握寻找...

    数学广角《烙饼问题》教学设计.doc

    《烙饼问题》是数学广角中的一节课,主要探讨如何高效地利用资源解决实际问题,特别是涉及到时间管理和优化策略的运用。这节课的核心知识点包括运筹思想、问题解决策略的多样性、寻找最优方案以及数学在日常生活中的...

    《烙饼问题》.ppt

    《烙饼问题》是数学中一个经典的优化问题,主要探讨如何高效地利用有限的资源来完成一系列任务。在这个问题中,我们关注的是如何在一只锅里烙饼,每次可以烙固定数量的饼,并且每面都需要一定时间才能熟。通过解决这...

    烙饼问题 (2).ppt

    "烙饼问题",也被称为"煎饼翻转问题",是计算机科学和数学中一个经典的时间优化问题,源于日常生活中的烹饪场景。该问题的基本设定是:在一个只能同时烙两张饼的平底锅中,每张饼需要正反两面各烙一次,每次烙一面...

    人教四年级数学上册烙饼问题PPT教案.pptx

    1. **最优化策略**:烙饼问题的核心是寻找最高效的烹饪方法,以最少的时间满足所有人的需求。在这个案例中,关键在于如何安排三张饼的烙制顺序,使得总的烙饼时间达到最短。对于三张饼的情况,最佳策略是先烙前两张...

    数学广角烙饼问题PPT学习教案.pptx

    数学广角中的“烙饼问题”,也被称为“煎饼问题”或“烤饼问题”,是运筹学中的一个经典问题,通常用于教授优化策略和问题解决技巧。在这一问题中,我们考虑如何在最短的时间内用一个平底锅烙完一定数量的饼,每次锅...

    人教版四年级数学上册烙饼问题PPT教案.pptx

    1. **烙饼问题**:烙饼问题是一种经典的优化问题,通常出现在小学数学的教学中,旨在训练学生的逻辑思维和优化策略。在这个问题中,每次只能同时烙两张饼,每面需要烙3分钟,目标是找到最短的时间来烙制一定数量的饼...

    《烙饼问题》课件.ppt

    《烙饼问题》是数学中一个经典的时间优化问题,它主要涉及到如何在有限的资源和条件下,通过合理的规划和策略,以最小的时间成本完成任务。在这个问题中,我们假设有一个平底锅,每次可以同时烙两张饼,每张饼需要烙...

    新人教版四年级上册数学 第2课时 烙饼问题 重点习题练习复习课件.pptx

    解决烙饼问题的关键在于“交替翻煎”。具体步骤如下: 1. 将两张煎饼放入平底锅,烙第一面,用时3分钟。 2. 取出已熟一面的煎饼,将另一面未熟的煎饼翻过来继续烙,同时将第三张煎饼放入锅中烙第一面,再用3分钟。 3...

    《数学广角合理烙饼问题》课件.ppt

    《数学广角合理烙饼问题》是一门课程,旨在教授如何高效解决数学中的优化问题,特别是涉及时间管理和资源利用的问题。在这个课件中,我们关注的是一个经典的数学问题,即如何在最少的时间内烙制一定数量的饼,每个饼...

    四年级数学上册数学广角烙饼问题PPT学习教案.pptx

    《四年级数学上册数学广角烙饼问题》是一份专为四年级学生设计的数学教学资源,旨在通过“烙饼问题”引导学生理解和应用优化思想。这个问题涉及到时间管理和效率优化,是数学中的一个经典应用题型。 在这个问题中,...

    小学数学四年级上册数学广角优化烙饼问题PPT学习教案.pptx

    这份小学四年级上册的数学广角优化烙饼问题PPT学习教案主要讲解了如何高效地解决实际生活中的优化问题,特别是与烹饪相关的数学问题。其中的核心知识点包括: 1. **交替烙饼法**:当锅只能同时烙两张饼时,为了最大...

Global site tag (gtag.js) - Google Analytics