• N层电梯只停一层情况下,求所有人爬楼层数最少


    一,题目:

         石家庄铁道大学基础教学楼一共有四部电梯,每层都有人上下,电梯在每一层都停。信1201-1班张一东每层都停有点儿不耐烦。如果在上下课高峰时刻电梯从一层上行,但只允许停留在某一层。每个人选择自己的目的地,使他们爬楼层数最少。

    二,设计思想:

      1,(基础算法)首先用最笨的办法去思考这个问题,就是让电梯从第二层楼开始停。然后计算所有人爬楼层数之和,知道第N层,然后找出爬楼层数最少的就是电梯要停留的层数。

      2,(优化算法)假设电梯停在第 i 层楼,我们计算出所有乘客总共爬楼梯的层数是Y。如果有N1个乘客想去的楼层在第 i 层之下,有N2个乘客正好想去的楼层是第 i 层,有N3个乘客想去的楼层在第 i 层之上。这个时候,重点来了:如果电梯改停在i-1层,所有目的地在第i - 1层以下的乘客可以少爬1层,总共少爬N1层,所有在i层及以上的乘客要多爬一层,总共多爬N2+N3层,这时总共需要爬Y-N1+N2+N3。反之,如果电梯在i+1层停所有目的地在第 i 层以上的乘客可以少爬1层,总共少爬N3层,所有在 i 层及以下的乘客要多爬一层,总共多N1+N2层,这时总共需要爬Y+N1+N2-N3层。可见,当N1 > N2+N3 时,电梯在第i-1层楼停更好;当N1+N2 <  N3 时,电梯在i+1层停更好。其他情况在第i层更好。如此一来,问题的解法就出来了,从第一层开始考察,计算各位乘客走的楼层的数目,然后根据N1,N2,N3之间的关系进行调整,知道找到最佳楼层。

    三,程序源代码:

    package com.java.com.aikan;
      
      import java.util.Scanner;
      
      public class dianti2 {
          public static void main(String[] args){
              int N,num;//电梯层数,乘客要停的电梯数
              Scanner in=new Scanner(System.in);
              System.out.print("请输入楼层数:");
             N=in.nextInt();
             int array[]=new int[N+1];
             for(int i=2;i<=N;i++)
             {
                 System.out.print("请输入去第"+i+"层的乘客数:");
                 array[i]=in.nextInt();
             }
             youhua(N,array);
         }
         }
         public static void youhua(int N,int array[])//优化
         {
             int N1=0,N2=0,N3=0,i,j,k;
             int min=0,m=2,sum=0;
             array[1]=0;
             for(i=2;i<=N;i++)
                 sum+=array[i];
             for(i=2;i<=N;)
             {
                 N1+=array[i-1];
                 N2=array[i];
                 N3=sum-N1-N2;
                 if(N1+N2<N3)
                     i++;
                 else
                     break;
             }
             for(j=2;j<=N;j++)
             {
    
                 k=i>j?(i-j):(j-i);
                 min+=array[j]*k;
             }
             System.out.println("停在第"+i+"层,上下楼层数最小值"+min);
         }
         
     }

    四,程序截图:

    五,实验总结:

      在看到这道题时我们先对题意进行透彻的分析避免对题意误解,在理解了题意之后用了最简单的思想去对问题进行了分析,就是对每一楼层进行遍历,求出在每一层的爬楼层数后求出最小的那一个,后来在老师的引导下对这一思想进行了优化,就是对问题进行一个假设,这是解题的关键。通过这次练习我又学习了一种新的解题思路——假设法,即先给问题假设一个结论,然后再去验证此结论。

  • 相关阅读:
    让 vscode 作为 SpringBoot,Java,Maven,甚至于 JavaScript,C,C++,Python,Php等多语言的开发工具吧!
    MySQL 连接错误集锦
    前端开发工具库:包含事件委托,动画处理,以及大部分常用的前端工具
    初探 Node.js 框架:eggjs (环境搭配篇)
    如何快速搭建一个 Node.JS 项目并进入开发?
    关于 JavaSrcipt 前端开发的建议:模块化开发
    Spring-Session 会话共享 -> 基于 Redis 集群,内附各大错误合集,包括配置,类寻找不到、连接错误等
    Java Email 邮件发送
    CSS 显示或隐藏子元素
    Ubuntu美化及配置,常见问题解决方案(仿 Mac 风格)
  • 原文地址:https://www.cnblogs.com/hushunli/p/4440367.html
Copyright © 2020-2023  润新知