編程之美﹣電梯調度算法

最近想详细研究一下电梯调度算法,但是所涉及到内容太多了,目前没有时间了。关于电梯算法的种类:

http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html

那我只能研究一下简单的了。

这是编程之美中的一道题目:

一座大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯在每层都停。

实习生小飞常常会被每层都停的电梯弄得很不耐烦,于是他提出了这样的一个办法:

由于楼层并不太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的一层。所有乘客都从一楼上电梯,到达某楼层后,电梯停下来,所有乘客再从这里爬到自己的目的层。在一楼上电梯的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。

问:电梯停在哪一层,能够保证这次乘坐的电梯所有乘客爬楼梯的层数之和最少。

直接贴出我用java实现的代码吧:

public static void main(String[] args)
	{
		for (int n = 0; n < 10; n++)
		{
			int nums[] = getInfoInOneElevator();
			System.out.println("一共有:" + nums.length + "人上楼,分别上得楼层数为:");
			for (int i = 0; i < nums.length; i++)
			{
				System.out.print(nums[i] + " ");
			}
			System.out.println("");
			int[] info = getMinTotalSteps(nums);
			System.out.println("最小步数:" + info[0]);
			System.out.println("停在楼层:" + info[1]);
			System.out.println("-----------------------------");
		}
	}

	/**
	 * 根据一电梯中人的信息,计算出最小需要爬得步数,和电梯应该停的楼层
	 */
	public static int[] getMinTotalSteps(int nums[])
	{
		int minStep = level * nums.length; // 默认都去最高层
		int nFloor = -1;
		for (int i = 0; i < level; i++)
		{
			int tempStep = 0;
			for (int j = 0; j < nums.length; j++)
			{
				tempStep += Math.abs(nums[j] - i - 1);
			}
			if (minStep > tempStep)
			{
				minStep = tempStep;
				nFloor = i + 1;
			}
		}
		return new int[] { minStep, nFloor };
	}

	/**
	 * 随机得到一批的上电梯的人,限载人13
	 */
	public static int[] getInfoInOneElevator()
	{
		// 随机上来的人数
		int[] nums = new int[(int) (Math.random() * 13)];
		for (int i = 0; i < nums.length; i++)
		{
			nums[i] = (int) (Math.random() * level) + 1;
		}
		return nums;
	}

经过10次随机模拟:

这个问题比较简单,以后有时间详细的模拟各个电梯调度算法。

时间: 2024-10-10 22:58:03

編程之美﹣電梯調度算法的相关文章

操作系統3-處理機調度與死鎖(死鎖)

操作系統-處理機調度與死鎖3(死鎖) 7.死鎖問題 死鎖是指多個進程等待其它進程佔有的資源,因而無限期等待下去的局面. 系統發生死鎖時,一定具備以下四個條件: 互斥條件.對於一個排他性資源,某一時刻最多允許一個進程佔有. 佔有且申請條件.進程至少已佔有一個資源,又要申請新的資源.此時該進程阻塞,且在等待過程中不釋放已經佔有的資源. 不可搶佔條件.進程獲得的資源在未使用之前,其他進程不得搶佔該資源. 環路條件.若干個進程相互要佔有彼此的資源,形成一個環路. 8.死鎖的避免 要避免死鎖,分為靜態策略

编程之美5:求数组中最长递增子序列

最近楼楼被男朋友带着玩dota,有点上瘾,终于在昨天晚上作出了一个重大的决定,shift+delete删掉warIII文件夹,从此退出dota的明争暗斗.不过最近看男票已经将战场从11转到了topcoder,嗯,这是个好现象,希望楼楼也能跟着玩儿起来. 理想是美好的,唉,可是楼主还在编程之美的初级阶段啊.话不多说了,希望自己加油加油再加油!!(^o^)/~ 今天要看的一道题目是求数组中最长递增子序列. 题目简介: 写一个时间复杂度尽可能低的程序,求一个一维数组(N)个元素中的最长递增子序列的长度

编程之美2.14 求数组的子数组之和的最大值

问题描述: 一个有N个整数元素的一维数组(A[0], A[1], A[2],...,A[n-1]),这个数组当然有很多子数组,那么子数组之和的最大值是什么呢? 解法: 1. 暴力解法-------O(N^3) 2. 改进版暴力解法-------O(N^2) *3. 分治算法-------O(NlogN)(暂时未去实现) 4. 数组间关系法-------O(N) 具体思路和代码: 1.暴力解法 思路:Sum[i,...,j]为数组第i个元素到第j个元素的和,遍历所有可能的Sum[i,...,j].

编程之美2.17 数组循环移位

问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法------O(KN) 思路:循环K次,每次移动一位 代码: 1 //右移 2 void s1(int A[], int n, int k) 3 { 4 k = k % n; 5 for(int i = 0; i < k; i++) 6 { 7 int t = A[n-1]; 8 for(int j = n-

编程之美2.17之数组循环移位

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求算法的时间复杂度位O(Log2N),且只允许使用两个附加变量. 什么意思呢,就是说如果输入序列为:abcd1234,右移2位即变为34abcd12.唯一的要求就是使用两个附加变量. 其实这道题编程珠玑上面也出现过,书中给出的一种符合题意的解法是巧妙地进行翻转.以把abcd1234右移4位为例: 第一步:翻转1234,abcd1234---->abcd4321 第二步:翻转abcd,abcd4321---->dcba4321 第三

编程之美2.13 子数组最大乘积

问题描述: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度. 解法: 1.暴力解法------O(n^2) 2.前后缀法------O(n) 3.统计法--------O(n) 具体思路和代码: 1.暴力解法: 思路:利用两层循环,依次删掉一个,其余的做乘法,计算出最大的. 代码: 1 int s1(int A[], int n) 2 { 3 int s = 1; 4 int max; 5 for(int i = 1;

编程之美2.1 求二进制中1的个数

最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表,位运算,数组,hash表应用等等. 由于最近事情也忙得差不多了,我重新写了一遍编程之美中的算法,在这里记录下来,以便以后阅读方便. 第一道题从2.1写起,这道题目难度不是很大,首先,给出这个题目的函数声明: /*2.1 求二进制中1的个数*/ int DutCountOf1InBin_1(unsig

Java 编程之美:并发极速赛车平台出租编程高级篇

借用 Java 并发极速赛车平台出租haozbbs.comQ1446595067 编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了. 相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的. 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步: 而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫

转:文本相似度算法

文本相似度算法 原文出自:http://www.cnblogs.com/liangxiaxu/archive/2012/05/05/2484972.html 1.信息检索中的重要发明TF-IDF 1.1TF Term frequency即关键词词频,是指一篇文章中关键词出现的频率,比如在一篇M个词的文章中有N个该关键词,则 (公式1.1-1) 为该关键词在这篇文章中的词频. 1.2IDF Inverse document frequency指逆向文本频率,是用于衡量关键词权重的指数,由公式 (公