1.8 小飞的电梯调度算法
生活随笔
收集整理的這篇文章主要介紹了
1.8 小飞的电梯调度算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:有一棟樓,如今設計一種電梯調度算法:電梯在一樓讓大家上電梯,然后依據大家選擇要到的樓層算出某一樓層i,電梯在i層停下讓全部人下電梯,然后大家爬樓梯達到自己的樓層。請問電梯停在哪一層。能夠使得這一次的全部乘客爬樓層之和最短?
(一)
最直接最簡單的方法就是直接枚舉從第一層到最后一層,然后算出電梯停在哪一層會使得全部乘客爬樓層之和最短。
代碼例如以下:
int nPerson[]; //nPerson[i]表示到第i層的乘客的數目 int nFloor = 0, nMinFloor = 0; int nTargetFloor = -1; for(int i = 1; i <= N; ++i) { //N代表樓層的總數for(int j = 1; j < i; ++j) nFloor += nPerson[j] * (i - j);for(int j = i + 1; j <= N; ++j) nFloor += nPerson[j] * (j - i);if(nTargetFloor == -1 || nFloor < nMinFloor) {nMinFloor = nFloor;nTargetFloor = i;} }
(二)
思路:當電梯停靠在第i層時,乘客所要爬的總的樓梯數為Y. 如果有N1個乘客要到達的層數<i,有N2個乘客要到達的層數==i,有N3個乘客要到達的層數>i. 所以有: (1)當電梯改停在i-1,則 Y+(N2+N3-N1) (2)當電梯改停在i+1,則 Y+(N1+N2-N3) 所以當后面那部分的值<0時(如(2)的N1+N2<N3),則加上負數后總的樓梯數比原來的小,即更優解. 因此,我們能夠從第一層開始,用以上策略,考察N1,N2,N3的值,依次調整以得到最優解.int nPerson[]; //nPerson[i]表示到第i層的乘客的數目 int nFloor = 0, nMinFloor = 0; int nTargetFloor = 1; int N1 = 0, N2 = 0, N3 = 0; for(N1 = 0, N2 = nPerson[1], N3 = 0, i = 2; i <= n; ++i) { //n代表樓層的數目N3 += nPerson[i];nMinFloor += nPerson[i] * (i - 1); } for(int i = 2; i <= n; ++i) {if(N1 + N2 < N3) {nTargetFloor = i;nMinFloor += (N1 + N2 - N3);N1 += N2;N2 = nPerson[i];N3 -= nPerson[i];}else break; }
轉載于:https://www.cnblogs.com/gccbuaa/p/6872531.html
總結
以上是生活随笔為你收集整理的1.8 小飞的电梯调度算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解决win8系统下卸载软件出现错误代
- 下一篇: 五大经常使用算法 之 动态规划法