China Open source community
站内导航:
站内排行前50热点文章

普通文章  C/C++程序员常见面试题...
精华文章  enum类型的本质
精华文章  Android线程模型
精华文章  linux下使用minicom的几...
普通文章  优化C语言代码(程序员必...
精华文章  22+1条经典的编程引言
普通文章  linux设置环境变量的方法
普通文章  Fedora 12 x86_64安装点滴
普通文章  在Eclipse中查看Androi...
普通文章  GCC的编译流程
普通文章  在ubuntu9.10下安装QT4...
普通文章  网络编程之C10K问题
普通文章  C语言函数入栈顺序与可...
普通文章  AVL树Source Code
普通文章  Python程序员常用的IDE...
普通文章  递归思想的妙用
普通文章  C++多态的随笔
普通文章  开放定址法解决hash冲突...
普通文章  python的memcache和jso...
普通文章  函数指针传递和全局指针...
普通文章  优质代码的十诫
普通文章  python非贪婪,多行匹配...
普通文章  brk和sbrk详述
普通文章  函数指针和指针函数
普通文章  Android Porting Exper...
普通文章  Linux 2.6内核中新的锁...
普通文章  虚函数和纯虚函数链接库...
普通文章  判断链表是否存在环并找...
普通文章  关于/etc/bashrc和$HOM...
普通文章  VC中各种字符串之间的相...
普通文章  Java里面的对象克隆
普通文章  Django实现大数据量分页...
普通文章  详解EL表达式
普通文章  复杂的指针
普通文章  Debian sudo 设置
普通文章  Debug方式取代printf满...
普通文章  c++文件调用c头文件注意...
普通文章  比较Java中几种数据cac...
普通文章  Singleton模式
普通文章  [翻译]Django初窥
普通文章  动态规划:背包问题
普通文章  vsftp配置详解
普通文章  编译 Chromium OS过程
普通文章  AJAX和XMLHTTP原理
普通文章  Python CGI实现用户会话
普通文章  Java连接sqlite
普通文章  EMC的一个笔试题目
普通文章  浅谈Python的相对路径与...
普通文章  整数的质因数分解算法
普通文章  内核list的安全使用

 
 
 
当前位置: 首页 >> 程序设计 >> 数据结构和算法 >> 贪心法求解电梯问题
 
 

贪心法求解电梯问题

作者:bpsub      来源:zz     发表时间:2009-12-29     浏览次数:      字号:    

内容摘要 algorithm

中国源码网内相关主题链接
  • Recurve and not Recurve alg...
  • #include <cstdio>
    #include <string>
    enum{M=30001};
    bool ind[M];
    int n;
    // 20*|j-i| +10*num + (j-1)*4<=t  ,这是电梯停在j层时,任何一个人到达i层所需的时间所要满足的不等式
    int solve(int t) //规定时间t内所有人是否都能到达目标层
    {
        int i,j,now=0,num=0;
        i=t/20+2;   //i层以下的人直接走楼梯
        while(i<=n)
        {
            while(i<=n && ind[i]==false) //i层没人时不用理,即找到要停的第一层
                i++;   
            //ind[i]=true;
            if((i-1)*4+10*num>t) //电梯无法在时间t之内到达i层,因为t已经小于到达i层时间的下界了
                return 0;  
            j=(t-10*num+20*i+4)/24; //电梯在第j层停靠最好,利用t时间范围内电梯在j停,某人向下走到i,尽量向上,此时j>i
            i=(t-10*num+16*j+4)/20+1;//电梯i层以下的都已经搞定,利用t时间范围内电梯在j停,向上能到达最大层i,之后直接升到i层上面,此时i>j;  这样会使电梯停的次数最小,体现了贪心算法
            num++;
        }
        return 1;
    }
    main()
    {
        int i,j,min,max,mid,t;
        //freopen("data.txt","r",stdin)
        while(1)
        {
            scanf("%d",&t);
            if(t==0)
                break;
            memset(ind,false,sizeof(ind));
            n=-1;   //读入数据
            for(i=0;i<t;i++)
            {
                scanf("%d",&j);
                if(j>n)
                    n=j;
                ind[j]=true;
            }
            //二分法,查找区间为[min,max],其中min总是不可行的,max则为可行解
            min=0;max=14*(n-1);
            while(min<max-1)
            {
                mid=(min+max)/2;
                if(solve(mid)==1)
                    max=mid;
                else
                    min=mid;
            }
            printf("%d\n",max);
        }
        return 0;

    编辑 bpsub

     
     
     
    评论
     
     
    发表
     
    姓名: QQ:
    性别: MSN:
    E-mail: 主页:
    评分: 1 2 3 4 5
    评论内容:
    验证码:
      
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - www.YuanMa.org - 中国 开放源代码+编程 社区