• 楚楚街2016招聘笔试(航线)


    楚楚街2016招聘笔试(航线)



    题目描述


    “呼!!终于到了,可是接下来要怎么走才能到达楚楚街港港呢?”亮亮在醋溜港直发愁。


     突然“啾”的一下,一只银色小船出现在亮亮的面前,上面坐着小精灵丹丹“又见面了,有什么可以帮助你的么?”


    小精灵向亮亮眨了眨眼睛,微笑着说。 “我想去楚楚街港,但我不知道要怎么走,请问你可以告诉我么?”亮亮按捺着激动的心情轻声问道。


     “楚楚街港呀……那是个特别美好的地方”小精灵歪着头想了想,说“我只能告诉你大海上所有的航线,剩下的就只能靠你自己啦~” 


    “只有所有的航线呀”,亮亮的内心再三挣扎,却又没有其他的办法。 “不管有多困难,我一定要达到楚楚街港,请你告诉我吧”亮亮坚定地对小精灵说。 


    小精灵欣赏地点了点头,递给亮亮一张航线图,并叮嘱道“时限是1000天,一定要到哦~”,然后如来时一般“啾”的一声,消失了。 


    亮亮现在迫切地想要抵达楚楚街港,请问亮亮最快能在第几天抵达楚楚街港呢?


    输入描述:


    一行包含两个整数 N(2<=N<=500),M(1<=M<=2000),用单个空格隔开。表示公有 N 个港,M 条航线。起点为 1,终点为 N。


    接下来 M 行,每行包含五个整数P,Q(1<=P,Q<=n), K(1<=K<=1000),X,Y(0<=X,Y<=10000),代表 P、Q 两个港有航线并需要 K 天,并且该航线在第 X 天到第 Y 天天气恶劣不可通行。


    输出描述:


    一个整数,即亮亮最快能在第几天抵达楚楚街港


    输入例子:


    4 4

    2 1 1 7 13

    4 3 2 10 11

    1 3 8 9 12

    2 3 3 2 10


    输出例子:


    14



    java版本的代码实现:

    package cn.cat.test;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    import java.util.TreeSet;
    
    public class Test09 {
    	
    	public static void main(String[] args) {
    		/*
    		 * 解题思路:此题目涉及到单源最短路径问题,采用Dijkstra算法
    		 * 
    		 */
    		
    		//起始地
    		int src = 1;
    		//目的地
    		int target = 4;
    		//线路
    		int[][] lines = new int[][]{
    			{2, 1, 1, 7, 13	},
    			{4, 3, 2, 9, 9},
    			{1, 3, 8, 9, 12},
    			{2, 3, 3, 2, 10},
    			{1, 4, 10, 2, 3}
    		};
    		
    		LineWayPlan lineWayPlan = new LineWayPlan(lines);
    		LineWayPlan.LineWayInfo optimumLineWay = lineWayPlan.getOptimumLineWay(src, target);
    		System.out.println(optimumLineWay);
    	}
    	
    	/** 最短航路方向规划
    	 * <PRE>
    	 * Filename:    Test09.java
    	 * Description: 
    	 * Copyright:   Copyright (c) 2016
    	 * Company:     TCL Co., Ltd.
    	 * </PRE>
    	 * @author      gwj
    	 * @version     1.0
    	 * <PRE>
    	 * Create at:   2017年6月19日 上午10:08:19 
    	 * Modification History:
    	 * Date         Author      Version     Description
    	 * ------------------------------------------------------------------
    	 * 2017年6月19日 上午10:08:19       gwj     1.0         新建
    	 * </PRE>
    	 */
    	static class LineWayPlan{
    		//航线图
    		private final int[][] lines;
    		//待规划的港口编号。使用TreeSet,港口编号有小到大排序。
    		private Set<Integer> pendingPlanPortNum = new TreeSet<Integer>();
    		//最佳的线路走向方法
    		private List<LineWayInfo> optimumLineWay = new ArrayList<LineWayInfo>();
    		
    		
    		public LineWayPlan(int[][] lines) {
    			this.lines = lines;
    			for (int[] line : lines) {
    				pendingPlanPortNum.add(line[0]);
    				pendingPlanPortNum.add(line[1]);
    			}
    			//先格式化线路,方便后面的计算操作。
    			formatLines();
    			//计算出最佳航线
    			calcuteOptinumLineWay(1);
    		}
    		
    		/** 计算出最佳的航线方式
    		 * @Description: 
    		 * @author gwj
    		 * @Created 2017年6月19日 上午10:13:42 
    		 * @return void
    		 */
    		private void calcuteOptinumLineWay(int startPort) {
    			if (!pendingPlanPortNum.remove(startPort)) {
    				throw new IllegalArgumentException("没有对应的港口编号" + startPort);
    			}
    			for (int[] line : lines) {
    				if (line[0] == startPort) {
    					
    					boolean isReplace = false;
    					for (LineWayInfo lineWay : optimumLineWay) {
    						int needDay = lineWay.needDay + line[2];
    						//刚好遇到天气变动的时间内,需要等天气变好后再航行。
    						if (needDay >= line[3] &&
    								(needDay <= line[4] || lineWay.needDay < line[4])) {
    							//line[4]的元素指坏天气的结束时间,从此结束时间开始行航行。
    							needDay = line[2] + line[4];
    						}
    						
    						if (lineWay.srcPort == startPort && lineWay.desPort == line[1]
    								&& lineWay.needDay > needDay) {
    							//当前线路已经存在,但又更短的耗时时间,故更新耗时时间
    							lineWay.needDay = needDay;
    							isReplace = true;
    							
    						} else if (lineWay.desPort == startPort){
    							//当前线路有连接点,继续连接线路长度
    							lineWay.needDay = needDay;
    							lineWay.desPort = line[1];
    							isReplace = true;
    							
    						}
    					}
    					if (!isReplace) {
    						int needDay = line[2];
    						//刚好遇到天气变动的时间内,需要等天气变好后再航行。
    						if (needDay >= line[3] && needDay <= line[4] ||
    								line[4] < needDay) {
    							//line[4]的元素指坏天气的结束时间,从此结束时间开始行航行。
    							needDay = line[2] + line[4];
    						}
    						optimumLineWay.add(new LineWayInfo(startPort, line[1], needDay));
    					}
    					
    				}
    			}
    			Iterator<Integer> iterator = pendingPlanPortNum.iterator();
    			//如果还有未计算的港口航线,则递归遍历。
    			if (iterator.hasNext()) {
    				calcuteOptinumLineWay(iterator.next());
    			}
    		}
    		
    		
    		/** 格式化线路
    		 * @Description: 
    		 * @author gwj
    		 * @Created 2017年6月19日 上午10:31:03 
    		 * @return void
    		 */
    		private void formatLines() {
    			for (int[] line : lines) {
    				//格式化,把元素1的港口小于元素2的港口
    				if (line[0] > line [1]) {
    					swap(0, 1, line);
    				}
    			}
    		}
    		
    		/** 交换数组元素位置
    		 * @Description: 
    		 * @author gwj
    		 * @Created 2017年6月19日 上午10:29:54 
    		 * @param srcIndex
    		 * @param descIndex
    		 * @param data
    		 * @return void
    		 */
    		private void swap(int srcIndex, int descIndex, int[] data) {
    			int temp = data[descIndex];
    			data[descIndex] = data[srcIndex];
    			data[srcIndex] = temp;
    		}
    
    
    		
    		
    		/** 航线方向信息
    		 * <PRE>
    		 * Filename:    Test09.java
    		 * Description: 
    		 * Copyright:   Copyright (c) 2016
    		 * Company:     TCL Co., Ltd.
    		 * </PRE>
    		 * @author      gwj
    		 * @version     1.0
    		 * <PRE>
    		 * Create at:   2017年6月19日 上午9:50:51 
    		 * Modification History:
    		 * Date         Author      Version     Description
    		 * ------------------------------------------------------------------
    		 * 2017年6月19日 上午9:50:51       gwj     1.0         新建
    		 * </PRE>
    		 */
    		private static class LineWayInfo {
    			/**出发的港口
    			 * 
    			 */
    			int srcPort;
    			/**
    			 * 目的地港口
    			 */
    			int desPort;
    			/**
    			 * 到点此港口所需要的时间
    			 */
    			int needDay;
    			
    			
    			public LineWayInfo(int srcPort, int desPort, int needDay) {
    				this.srcPort = srcPort;
    				this.desPort = desPort;
    				this.needDay = needDay;
    			}
    
    
    
    			@Override
    			public String toString() {
    				return srcPort + " -> " + desPort + "(所需时间为" + needDay + "天)";
    			}
    			
    		}
    		
    		
    		/** 获取最佳的航线方式
    		 * @Description: 
    		 * @author gwj
    		 * @Created 2017年6月19日 上午10:12:08 
    		 * @return
    		 * @return List<LineWayInfo>
    		 */
    		private LineWayInfo getOptimumLineWay(int src, int target) {
    			System.out.println(optimumLineWay);
    			int needDay = Integer.MAX_VALUE;
    			LineWayInfo result = null;
    			for (LineWayInfo lineWay : optimumLineWay) {
    				if (lineWay.srcPort == src && lineWay.desPort == target && needDay > lineWay.needDay) {
    					needDay = lineWay.needDay;
    					result = lineWay;
    				}
    			}
    			return result;
    		}
    		
    	}
    	
    }
    
    


    题目描述


    “呼!!终于到了,可是接下来要怎么走才能到达楚楚街港港呢?”亮亮在醋溜港直发愁。


     突然“啾”的一下,一只银色小船出现在亮亮的面前,上面坐着小精灵丹丹“又见面了,有什么可以帮助你的么?”


    小精灵向亮亮眨了眨眼睛,微笑着说。 “我想去楚楚街港,但我不知道要怎么走,请问你可以告诉我么?”亮亮按捺着激动的心情轻声问道。


     “楚楚街港呀……那是个特别美好的地方”小精灵歪着头想了想,说“我只能告诉你大海上所有的航线,剩下的就只能靠你自己啦~” 


    “只有所有的航线呀”,亮亮的内心再三挣扎,却又没有其他的办法。 “不管有多困难,我一定要达到楚楚街港,请你告诉我吧”亮亮坚定地对小精灵说。 


    小精灵欣赏地点了点头,递给亮亮一张航线图,并叮嘱道“时限是1000天,一定要到哦~”,然后如来时一般“啾”的一声,消失了。 


    亮亮现在迫切地想要抵达楚楚街港,请问亮亮最快能在第几天抵达楚楚街港呢?


    输入描述:


    一行包含两个整数 N(2<=N<=500),M(1<=M<=2000),用单个空格隔开。表示公有 N 个港,M 条航线。起点为 1,终点为 N。


    接下来 M 行,每行包含五个整数P,Q(1<=P,Q<=n), K(1<=K<=1000),X,Y(0<=X,Y<=10000),代表 P、Q 两个港有航线并需要 K 天,并且该航线在第 X 天到第 Y 天天气恶劣不可通行。


    输出描述:


    一个整数,即亮亮最快能在第几天抵达楚楚街港


    输入例子:


    4 4

    2 1 1 7 13

    4 3 2 10 11

    1 3 8 9 12

    2 3 3 2 10


    输出例子:


    14

  • 相关阅读:
    JS深度判断两个数组对象字段相同
    box-shadow inset
    swiper实现滑动到某页锁住不让滑动
    vuex上手文章参考
    js基础补漏
    react学习文章
    C# .Net String字符串效率提高-字符串拼接
    JS,Jquery获取各种屏幕的宽度和高度
    highcharts的dataLabels如何去处阴影
    .net C# 抽奖,中奖
  • 原文地址:https://www.cnblogs.com/catgwj/p/7492826.html
Copyright © 2020-2023  润新知