《编程之美》读书笔记04: 1.8 小飞的电梯调度算法

《编程之美》读书笔记04: 1.8 小飞的电梯调度算法

 

假设电梯有n层,上楼要消耗能量k1,下楼要消耗能量k2,用a[i]表示要在第i层下的人数,Si为到i层时已经下(包括i层)的总人数,则总人数S=Sn。若用F(i)表示电梯在i层停时要消耗的总能量,则电梯在i+1层停时,有Si人要多下一层,(S-Si)人少上一层。则:  

F(i+1) = F(i) + k2*Si - k1*(S-Si) = F(i) + (k2+k1)*Si – k1*S = F(i) + G(i)

(定义G(i) = (k2+k1)*Si – k1*S)

 

由于Si是递增的,G(i)也是递增的,当G(i) <= 0,F(i+1) <= F(i),“求使F(i)最小的i”问题等同于 “求使G(i)=(k2+k1)*Si – k1*S <= 0的最大i值”(所得i值+1即为原问题的解),或 “求使G(i)=(k2+k1)*Si – k1*S >= 0的最小i值”(所得i值即为原问题的解)。注意:等号可取可不取。

 

对书上原题:k1=k2=1,G(i)=2*Si – S >= 0,可以扫描数组两遍,第一遍算出S,第二遍算出使 2*Si – S < 0 的最大i值。也可以只扫找一遍,用两个指针分别指向数组的开头和结尾,一个向前移动,一个向后移动,并同时开始计算最前几个数的和S2, i和最后几个数的和Sj, n,通过调整两个指针位置,使S2, i<= Sj, n总成立并使i尽可能的大,这样扫描完毕,

2*S2, i <= S2, i + Si+1, n = S,且 2*S2, i+1 >= S。

 

(书中解法二的分析与给出的代码不对应,只有证明“使N1 + N2 >= N3成立的第一个i值就是全局最优解”,才能保证给出的代码的正确性。)


程序代码 // arr[i] 为在第i层要下的人数,因而i>=2;
 2 int  lift( int  * arr, unsigned sz,  int &  total)
 3 {
 4  assert(sz>=3);
 5  int i, sum=0, count=0;
 6  total=0;
 7  for (i=2; i<sz; i++){
 8    sum += arr[i];
 9    total += arr[i]*i;
10  }

11  total = total - sum * 2;
12  for ( i=2; ; i++){
13    count += arr[i] * 2;
14    if ( count >= sum ) break;
15    total += count - sum;
16  }

17  return i;
18}

19
20
21
22 // arr[i] 为在第i层要下的人数,因而i>=2;
23
24 int  lift2( int  * arr, unsigned sz,  int &  total)
25 {
26  assert(sz>=3);
27  int *low=arr+2*high=arr+sz-1;
28  int sum_a=0, sum_b=0, sum_ta=0, sum_tb=0;
29  while (low <= high){
30    if (sum_a <= sum_b){
31      sum_a += *low++;
32      sum_ta += sum_a;
33    }
 else{
34      sum_b += *high--;
35      sum_tb += sum_b;
36    }

37  }

38  --low;
39//电梯所停的那层始终被计算了,要扣除
40  if (sum_a >= sum_b){
41    sum_ta -= sum_a;
42  }
 else{
43    ++low;
44sum_tb -= sum_b;
45  }

46
47  total = sum_ta + sum_tb;
48  return low - arr;
49}

50


转载于:https://www.cnblogs.com/flyinghearts/archive/2011/03/22/1991969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值