![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include <stdio.h> #define N 6 int nPerson[6] = {1,2,3,4,5,6}; void min_floor(int& floor, int& min) { for (int i = 0; i < N; i++) { int sum = 0; for (int j = 0; j< N; j++) { sum += nPerson[j] * (i > j ? i - j : j - i); } if (sum < min) { min = sum; floor = i; } } return; } void min_floor2(int& floor, int &min) { int N1 = 0, N2 = nPerson[0], N3 = 0; for (int i = 1; i < N;i++) { min += nPerson[i] * i; N3 += nPerson[i]; } for (int i = 1; i < N; i++) { if (N1 + N2 < N3) { floor = i; min += (N1 + N2 - N3); N1 += N2; N2 = nPerson[i]; N3 -= nPerson[i]; } else { break; } } } int main(int, char**) { int min = 99999999; int floor = 0; min_floor(floor, min); printf("hello world %d %d\n",floor, min); min = 0; floor = 0; min_floor2(floor, min); printf("hello world %d %d\n", floor, min); return 0; }
方法二:书上提供的O(N)的动态规划的算法。
假设电梯停在i层楼,可以计算出所有乘客要爬楼层的层数为Y,假设此时有N1个乘客在i层楼以下,N2个乘客在I层楼,N3个乘客在I层楼以上,则当电梯停在i+1层的时候,N1+N2个乘客要多下一层楼,共多下N1+N2层,N3个乘客要少往上面爬一层楼,少上N3层楼,此时Y(i+1) = Y(i) + N1+N2-N3,很显然,当N1+N2<N3的时候,Y不断减小。Y1很容易算出来,另外我们还可以看出,N1+N2是递增的,N3是递减的,所以N1+N2一旦大于N3的时候,我们直接退出循环即可,没有必要再计算下去了。