小飞的电梯调度算法,光影切割问题<<编程之美>>

小飞的电梯调度算法:

1.8问题描述:

小飞是实习程序员,下班高峰期时电梯的每层都有人上下,等电梯是件烦人的事情。

小飞有个方案:电梯每次计算里面的人,和上的楼层,从而统计出在哪一层停,该上楼的出电梯爬楼梯;该下楼的出电梯爬楼梯下去。

问题:电梯停靠在哪一层,能保证这次乘客爬楼梯的层数总和最少?


分析:

要算出乘客爬楼梯的层数最少。关键就是统计每次做电梯的人数,和楼层的总高度。

现在假设总共有N层,电梯停在第x层,到第i 层的人数为Tot[i];

需要走的层数为 sigma{Tot[i]*|x-i|};


解法一:从第一层开始计算,用枚举法x到第N层。O(N*N)

int  p[]//p[i],表示到达i层的人数;
int MinFloor,TargetFloor,Floor;
TargetFloor=-1;
for(i=1;i<=N;++i){
    Floor=0;
    for(j=1;j<i;++j)
        Floor=p[j]*(i-j);
    for(j=i+1;j<=N;++j)
        Floot=p[j]*(j-i);
    if(TargetFloor==-1||MinFloor>Floor){
        TargetFloor=i;
        MinFloor=Floor;
    }
    
}
return(TargetFloor,MinFloor);

时间复杂度O(N*N);



解法二:优化算法 时间复杂度O(N);

现在先规定到达抵达第i层乘客们一共需要爬Y层。到达第i层的有X2人,第i层以下x1人,到达第i层以上有x3人;

现在假设电梯在(i-1)层停下来,i层以下的人少走x1层;此时i层以上的人要多爬(x2+x3)层;

所以第(i-1)层停下时:Y-x1+x2+x3=Y-(x1-x2-x3)

同理在第(i+1)层停下时:多走x1+x2,少走x3    可得      Y+x1+x2-x3=Y-(x3-x1-x2)

当i层以下的人数比i层以上的人数和第i层人数之和大选在(i-1)层停。即x1>x2+x3

那么当x3>x1+x2时,在第(i+1)层停。

int p[]//p[i]表示需要在到达第i层的人数
int MinFloor,TargetFloor;
int x1,x2,x3;
MinFloor=0;
TargetFloor=1;
for(x1=0,x2=p[1],x3=0,i=2;i<=N;++i){//求出第i层,总共需要走Y层
    x3+=p[i];
    MinFloor+=p[i]*(i-1);
    }
for(i=2;i<=N;++i){//for循环的功能是进行一层一层的枚举,上述那个(x1+x2<x3),
                                //选用第i+1层停。
    if(x1+x2<x3){
        MinFloor+=x1+x2-x3;
        x1+=x2;
        x2=p[i];
        x3-=p[i];
    }
    break;
}
return(TargetFloor,MinFloor);


光影切割问题

1.7take note

问题描述:在cs游戏中的破旧仓库里。由于光线照射到地面,会形成光亮面和阴暗面。

如现在有三条光线照射在仓库里,地面形成了一块一块的光暗面,如图所示:1-8


现在的问题是:在x轴【a,b】的区间内,求出地面被分割的块数


    解决方法:遇到这题,首先是试数,构造出模拟图,观察规律。

两条线,一个焦点,块数:4;

三条线,两个焦点,块数:6;

三条线,个焦点,块数:7


现在假设有N条线,M个交点;对于每增加一条线,假设就多了m个交点,把这条线分割成(m+1)段,每条线段会将原来的区域分割成两块,那么在原    来的基础上就多出了就多出了一块,因此新增了(m+1)块区域。那么N条线,M个交点,就分割成(M+N+1)个区域。


回归到本题,它问的是在区间【a,b】上分割的块数。可以转化为找区间【a,b】的交点数。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值