代码如下: #include < iostream > using namespace std ; const int N = 10 ; int person[N + 1 ] = {0 , 2 , 5 , 7 , 3 , 5 , 2 , 6, 2 , 6 , 3} ; int floor2() { //先计算出在第一层停止的时候 所需要的花费 int T = 0; int N1 = 0 ; //在第一层以下下的人数 int N2 = person[1] ; //在第一层处下的人数 int N3 = 0 ; //在第一层之上下电梯的人数 int floor = 1 ; for(int i = 2 ; i <= N ;i++) //先计算出第1层停止需要爬取的楼层数目 { T += person[i] * (i - 1) ; N3 += person[i] ; } for(int i = 2 ; i <= N ;i++) { if(N1 + N2 <= N3) //说明第i+1层的结果会大于第i层 { T += N1 + N2 - N3 ; N1 += N2 ; N2 = person[i] ; N3 -= person[i] ; floor = i ; } else //否则第i层的结果已经最小,故不需要计算第i+1层 break ; } return floor ; } int floor1() // 使用简单算法计算 { int tempfloor = 0 ; int min = 6553 ;//存储最小值 int floor = 1 ;//存储停靠的楼层 int i , j ; for( i = 1 ; i <= N ;i++) //表示第i楼层电梯停靠 { tempfloor = 0 ; for( j = 1 ; j < i ;j++) tempfloor += (i - j) * person[j] ; for(j = i + 1 ; j <= N ; j++) tempfloor += (j - i) * person[j] ; if(min > tempfloor) { min = tempfloor ; floor = i ; } // cout<<"tempfloor"<<i<<":"<<tempfloor<<endl; } return floor ; } int main() { int temp1 = floor1() ; int temp2 = floor2() ; cout<<temp1<<" "<<temp2<<endl ; getchar() ; return 0 ; }