Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1006552
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2012-10-26 00:11:02

亚洲微软研究院所在的希格玛大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯每层都停。实习生小飞常常会被每层都停的电梯弄的很不耐烦,于是他提出了这样一个办法:
由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层。所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客再从这里爬楼梯到自己的目的层。在一楼的时候,每个乘客选择自己的目的层,电梯则计算出应停的楼层。

问:电梯停在哪一层楼,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少?

 

解析:

对于一个给定的有序数组 {1,3,5,5,7,9}, 求一个数,使得数组中每个数和这个数的差的绝对值的总和最小。

感觉编程之美的题目都是涉及变量较多,一般类似字符串的DP,要记录的变量也就1个2个,编程之美里的题目都要3个或者3个以上。所以这个题虽然不算难,但实际写出来也是要思考10-20分钟。

对于一个数字n, 假设数组中比n小的有left个,等于n的有mid个,大于n的有right个。用f(n)代表n与数组中每个数差的绝对值之和。有f(n) = m;

当n+1时,设等于n+1的数有midNext个,则此时:
 n+1左边的数有  left+mid个
 n+1右边的数有 right-mid个

相比较f(n)的情况, 位于n+1左边所有数与n+1的差的绝对值,增加了 left+mid
相比较f(n)的情况, 位于n+1左边所有数与n+1的差的绝对值,减少了 right-mid

    f(n+1) = f(n) + left + mid -(right-mid); 
    mid = midNext;


 

点击(此处)折叠或打开

  1. /*
  2.  * =====================================================================================
  3.  *
  4.  * Filename: lift.c
  5.  *
  6.  * Description:
  7.  *
  8.  * Version: 1.0
  9.  * Created: 10/25/2012 11:06:16 PM
  10.  * Revision: none
  11.  * Compiler: gcc
  12.  *
  13.  * Author: royn.wang.renyuan@gmail.com (),
  14.  * Organization:
  15.  *
  16.  * =====================================================================================
  17.  */
  18. #include <stdlib.h>


  19. #include <stdio.h>
  20. #define MAX 1000
  21. void getFloorNo(int *input, int size){
  22.     int result[MAX] = {0};
  23.     int lcount,mcount,rcount;
  24.     int cur;
  25.     int l,r;
  26.     int i;
  27.     l = r = 0;
  28.     cur = 0;
  29.     lcount = 0;
  30.     rcount = size;
  31.     mcount = 0;
  32.     for(i = 0;i<size;i++){
  33.         r+=input[i];
  34.     }
  35.     result[0] = r;
  36.     for(i=1;i<=input[size-1];i++){
  37.         lcount += mcount;
  38.         rcount -= mcount;
  39.         r -= rcount;
  40.         l += lcount;
  41.         result[i] = l + r;
  42.         printf ( "%d = %d\n",i, result[i] );
  43.         mcount = 0;
  44.         while(input[cur] == i){
  45.             cur++;
  46.             mcount++;
  47.         }
  48.     }
  49. }


  50. /*
  51.  * === FUNCTION ======================================================================
  52.  * Name: main
  53.  * Description:
  54.  * =====================================================================================
  55.  */
  56.     int
  57. main ( int argc, char *argv[] )
  58. {
  59.     int input[] = {1,3,5,5,7,9};
  60.     getFloorNo(input, sizeof(input)/sizeof(int));
  61.     return EXIT_SUCCESS;
  62. } /* ---------- end of function main ---------- */



 

阅读(1658) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~