编程之美——小飞的电梯调度算法

编程之美——小飞的电梯调度算法

        在高峰时间,实习生小飞常常会被电梯每层楼都停弄得很不耐烦,于是他想出了这样一个办法:由于楼层并不高,那么在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
  问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?

        解法一:从第一层开始枚举x一直到第N层,然后再计算出如果电梯在第x层楼停的话,所有乘客总共要爬多少层楼。算法的时间复杂度为o(n*2).

       程序为:

        #include<vector>
        #include<iostream>
        using namespace std;
        int main(void)
        {
           int i,j,n,person,temp,ans,layer;
           vector<int> num;
           while(cin>>n)
          {
            for(i=1;i<=n;i++)
           {
              cin>>person;
              num.push_back(person);    
          }  

         ans=-1;  
         for(i=1;i<=n;i++)  
         {  
         temp=0;  
         for(j=1;j<=n;j++)  
         {  
         if(i>=j)  
        temp+=num[j-1]*(i-j);  
        else
        temp+=num[j-1]*(j-i);    
        }  
         if(ans==-1||temp<ans)  
         {  
            ans=temp;  
            layer=i;  
         }  
        }  
         cout<<“最少的层数: “<<ans<<endl;  
         cout<<“在第 “<<layer<<” 层下”<<endl;  
        }  
          return 0;   
      }

        解法二:

       该方法降低了算法的时间复杂度,使得降低为线性复杂度O(n)。

        代码为:

        #include<vector>

        #include<iostream>

        using namespace std;

         int main(void)

          {

              int num1,num2,num3,i,n,ans,person,layer;

              vector<int> num;

              while(cin>>n)

                {

                    vector<int> sum(n+2);

                    sum[0]=0;

                    ans=0;

                     num.push_back(0);

                     for(i=1;i<=n;i++)

                     {

                          cin>>person;

                          num.push_back(person);

                          sum[i]=sum[i-1]+num[i];

                          ans+=num[i]*(i-1);

                       }

                      layer=1;  
                      for(i=2;i<=n;i++)  
                     {  
                           num2=num[i-1];   
                           num1=sum[i-1]-num2;  
                           num3=sum[n]-sum[i-1];  
                            if(num1+num2<num3)  
                           {  
                              ans=ans+num1+num2-num3;  
                               layer=i;  
                           }  
                      }  
        cout<<“最少的层数: “<<ans<<endl;  
        cout<<“在第 “<<layer<<” 层下”<<endl;  
      }   
          }

      参考资料:《编程之美》

    原文作者:快乐的霖霖
    原文地址: https://blog.csdn.net/chdhust/article/details/7451162
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞