1、简单的双重循环可以解决O(N *N )
2、书中提出另一种想法 假设电梯停在i层 爬楼梯的总数为Y 若电梯停在i-1层 则i层以上的N3人 需要多爬一层 i层的N2也需多爬一层 i-1层的N1人则少爬一层
所以总共走的数目为 Y-N1+N2+N3 即 Y-(N1-N2-N3)
若在i+1层停下 则i+1层的N3人少一层 i层和i-1层多走N2+N1 总的数目为Y-N3+N1+N2 即 Y-(N3-N1-N2)
因此可以从第二层开始 一直向上查找 最少的走楼梯数目
int flor::cal2()
{
sum=0;
for(int i=0;i<num;i++)
sum+=a[i]*i;//计算在第一楼停下 需要爬楼的总数
//std::cout<<sum<<std::endl;
int Y1=0;
int Y2=0;
int Y3=0;
for (int i=0;i<num;i++)
Y3+=a[i];
std::cout<<Y3<<std::endl;
for(int i=0;i<num && Y3>=0;i++)
{
Y1+=Y2;
Y2=a[i];
Y3-=Y2;
//std::cout<<i+1<<' '<<Y1<<' '<<Y2<<' '<<Y3<<' ';
if(Y1+Y2<Y3)
{
sum=sum+Y1+Y2-Y3;
}
//std::cout<<sum<<' '<<std::endl;
}
return sum;
}