编程之美——小飞的电梯调度算法
2012-04-11 21:23
411 查看
编程之美——小飞的电梯调度算法
在高峰时间,实习生小飞常常会被电梯每层楼都停弄得很不耐烦,于是他想出了这样一个办法:由于楼层并不高,那么在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?
解法一:从第一层开始枚举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
-sum[i-1];
if(num1+num2<num3)
{
ans=ans+num1+num2-num3;
layer=i;
}
}
cout<<"最少的层数: "<<ans<<endl;
cout<<"在第 "<<layer<<" 层下"<<endl;
}
}
参考资料:《编程之美》
在高峰时间,实习生小飞常常会被电梯每层楼都停弄得很不耐烦,于是他想出了这样一个办法:由于楼层并不高,那么在繁忙的时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客都从一楼上电梯,到达某层楼后,电梯听下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?
解法一:从第一层开始枚举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
-sum[i-1];
if(num1+num2<num3)
{
ans=ans+num1+num2-num3;
layer=i;
}
}
cout<<"最少的层数: "<<ans<<endl;
cout<<"在第 "<<layer<<" 层下"<<endl;
}
}
参考资料:《编程之美》
相关文章推荐
- 编程之美——小飞的电梯调度算法之新解
- 《编程之美》读书笔记之[小飞电梯调度算法]
- 课外娱乐__《编程之美》之小飞的电梯调度算法
- 编程之美 1.8小飞的电梯调度算法的第三种解
- 《编程之美》学而思 - 小飞的电梯调度算法
- 《编程之美》小飞的电梯调度算法
- 小飞的电梯调度算法(编程之美)
- 编程之美:小飞的电梯调度算法
- 《编程之美》读书笔记04: 1.8 小飞的电梯调度算法
- 编程之美——小飞的电梯调度算法之新解(中位数)
- 编程之美:小飞的电梯调度算法
- 编程之美:小飞的电梯调度算法
- 小飞的电梯调度算法@编程之美
- 《编程之美》小飞的电梯调度算法
- 编程之美1.8:小飞的电梯调度算法
- 《编程之美》中“小飞的电梯调度算法”停k层的解法
- 编程之美--小飞的电梯调度算法
- 小飞的电梯调度算法,光影切割问题<<编程之美>>
- 第1章 游戏之乐——小飞的电梯调度算法
- 1.8 小飞的电梯调度算法