zoukankan      html  css  js  c++  java
  • 楚楚街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

  • 相关阅读:
    target runtime apache v6.0 not defined解决
    java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
    The valid characters are defined in RFC 7230 and RFC 3986问题
    invalid END header解决方法
    You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    在eclipse中import java web项目时遇到的一些问题并将该项目通过tomcat发布
    java byte转string 涉及到字节流中有中文
    spring+mybatis框架搭建时遇到Mapped Statements collection does not contain value for...的错误
    试试看读一下Zepto源码
  • 原文地址:https://www.cnblogs.com/catgwj/p/7492826.html
Copyright © 2011-2022 走看看