标签:style blog color ar for sp 2014 c on
题目:有一栋楼,现在设计一种电梯调度算法:电梯在一楼让大家上电梯,然后根据大家选择要到的楼层算出某一楼层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; }
标签:style blog color ar for sp 2014 c on
原文地址:http://blog.csdn.net/u010470972/article/details/39854825