Islands Travel 微软2016校园招聘笔试题

2024-04-10 18:08

本文主要是介绍Islands Travel 微软2016校园招聘笔试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

There are N islands on a planet whose coordinates are (X1, Y1), (X2, Y2), (X3, Y3) ..., (XN, YN). You starts at the 1st island (X1, Y1) and your destination is the n-th island (XN, YN). Travelling between i-th and j-th islands will cost you min{|Xi-Xj|, |Yi-Yj|} (|a| denotes the absolute value of a. min{a, b} denotes the smaller value between a and b) gold coins. You want to know what is the minimum cost to travel from the 1st island to the n-th island.

输入

Line 1: an integer N.

Line 2~N+1: each line contains two integers Xi and Yi.


For 40% data, N<=1000,0<=Xi,Yi<=100000.

For 100% data, N<=100000,0<=Xi,Yi<=1000000000.

输出

Output the minimum cost.

样例输入
3
2 2
1 7
7 6
样例输出
2

题目分析

此题明显是单源最短路径生成算法

1. Floyd

一开始看错题了,以为要求能够遍历所有岛的 最短路径,以为是最小生出树算法,写出来TLE,复杂度o(n3);
Floyd选择最短边加入节点 生成最小生成树
源代码如下:
<pre name="code" class="java">import java.util.*;
public class IslandsTravel1138 {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {int n=in.nextInt();int[][] a=new int[n][2];for(int i=0;i<n;i++){a[i][0]=in.nextInt();a[i][1]=in.nextInt();}int[][] map=new int[n][n];for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){map[i][j]=Math.min(Math.abs(a[i][0]-a[j][0]), Math.abs(a[i][1]-a[j][1]));}}List<Integer> list1=new ArrayList<Integer>();List<Integer> list2=new ArrayList<Integer>();int min=Integer.MAX_VALUE;int x=0;int y=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(map[i][j]<min){min=map[i][j];x=i;y=j;}}}list1.add(x);list1.add(y);int sum=0;sum+=map[x][y];for(int i=0;i<n;i++){if((i!=x)&&(i!=y)) list2.add(i);}while(list1.size()<n){int[] tmp=new int[2];int tmpmin=Integer.MAX_VALUE;for(int i=0;i<list1.size();i++){for(int j=0;j<list2.size();j++){int xx=list1.get(i);int yy=list2.get(j);if(map[xx][yy]!=0&&map[xx][yy]<tmpmin){tmpmin=map[xx][yy];tmp[0]=xx;tmp[1]=yy;}}}sum+=tmpmin;list1.add(tmp[1]);list2.remove(Integer.valueOf(tmp[1]));}System.out.println(sum);}}
}

 

2. dijkstra算法

既然floyd会超时,那就换单源最短路径常见算法dijkstra算法。每次找到一个最短路径,更新其他节点的最短路径。当找到n-1结点的时候结束,复杂度为0(n2);

<pre name="code" class="java">import java.util.Scanner;
import java.util.*;
public class IslandsTravel2 {public static void main(String[] args) {int MAX=Integer.MAX_VALUE;Scanner in = new Scanner(System.in);int n=in.nextInt();int[][] a=new int[n][2];for(int i=0;i<n;i++){a[i][0]=in.nextInt();a[i][1]=in.nextInt();}int[] dis=new int[n];boolean[] flag=new boolean[n];flag[0]=true;for(int i=1;i<n;i++){dis[i]=getdis(0,i,a);}for(int i=1;i<n;i++){int index=-1;int min=MAX;for(int j=1;j<n;j++){if((!flag[j])&&(dis[j]<min)){index=j;min=dis[j];}}if(index==-1) break;flag[index]=true;for(int k=1;k<n;k++){int disjk=getdis(index,k,a);if(disjk+dis[index]<dis[k]){dis[k]=disjk+dis[index];}}}System.out.println(dis[n-1]);}public static int getdis(int i,int j,int[][] a){return Math.min(Math.abs(a[i][0]-a[j][0]), Math.abs(a[i][1]-a[j][1]));}
}


 

依旧TLE

2. SPFA算法以及优化

后来查资料,了解到SPFA算法,复杂度O(ke)k一般为2
这样我们只要找到的边尽可能的少,进行相关优化就可以啦。
我们可以知道我们必须通过离点(x,y)尽可能近的点才能优化此点。

在本题中,最近距离的处理上,还有另一个很重要的性质:

对于任意一个点i,在x坐标和y坐标排序后,坐标值不等于点i,且最靠近点i的点。我们称为点i的邻居。如下图中所示的绿色点:

pic1

通过该图可以知道,邻居节点一定是在虚线的交点处,因此对于点i,邻居节点至多有4个。并且在图中黄色的区域,也就是点i的上下左右4个区域内是不存在其他点的。其他点只能存在于绿色的区域内。

假设有一个点j,存在于绿色区域内,可以证明从点j直接到点i的距离一定不会优于点j先到邻居节点再到点i

formula1

通过邻居节点则:

formula2

由于:

formula3

因此有:

formula4

所以我们并不需要将点i和点j的边进行连接,只需要连接点i和邻居节点的边即可。

所以最后通过的源代码如下:
<pre name="code" class="java">import java.util.Scanner;
import java.util.*;
public class IslandsTravel3SPFA {final static int MAXINT = 1000000000;public static void main(String[] args) {int MAX=Integer.MAX_VALUE;Scanner in = new Scanner(System.in);while(in.hasNext()){int n=in.nextInt();Node[] node=new Node[n];for(int i=0;i<n;i++){node[i]=new Node(in.nextInt(),in.nextInt(),i);}List<List<Dis>> graph=new ArrayList<List<Dis>>();for(int i=0;i<n;i++){graph.add(new ArrayList<Dis>());}build(node,graph);for(int i=0;i<n;i++){swap(node[i]);}build(node,graph);int[] dis=new int[n];for(int i=1;i<n;i++){dis[i]=MAX;}LinkedList<Integer> queue=new LinkedList<Integer>();queue.add(0);//设置queue标志位,避免计算是否包含浪费时间boolean[] flag=new boolean[n];flag[0]=true;while(!queue.isEmpty()){int k=queue.pollFirst();List<Dis> list=graph.get(k);flag[k]=false;for(Dis tmp:list){int num=tmp.num;int d=tmp.d;if(dis[k]+d<dis[num]){dis[num]=dis[k]+d;if(flag[num]==false){queue.add(num);flag[num]=true;}}}}System.out.println(dis[n-1]);}in.close();}public static void build(Node[] A,List<List<Dis>> graph){Arrays.sort(A);int n=A.length;for(int i=1;i<n;i++){int num=A[i].num;int pre=A[i-1].num;graph.get(num).add(new Dis(pre,A[i].x-A[i-1].x));graph.get(pre).add(new Dis(num,A[i].x-A[i-1].x));}}public static void swap(Node node){int tmp=node.x;node.x=node.y;node.y=tmp;}public static class Node implements Comparable<Node>{int x;int y;int num;Node(int x,int y,int num){this.x=x;this.y=y;this.num=num;}@Overridepublic int compareTo(Node node) {// TODO Auto-generated method stubif(this.x>node.x) return 1;else if(this.x<node.x) return -1;else return 0;}}public static class Dis{int num;int d;Dis(int num,int d){this.num=num;this.d=d;}}}


 

这篇关于Islands Travel 微软2016校园招聘笔试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891767

相关文章

微软正式推出 Spartan 斯巴达浏览器

作为用于替代 IE 浏览器的下一代继任者,微软的 Project Spartan 斯巴达浏览器可算是吊足了玩家们的胃口!如今,在最新的 Windows 10 Build 10049 版本起,它终于正式登场了。 斯巴达浏览器搭载了全新的渲染引擎、新的用户界面并集成了 Cortana 语音助手。功能上新增了稍后阅读列表、阅读视图、F12开发者工具、支持网页注释 (手写涂鸦),可以保存到 O

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

未雨绸缪:环保专包二级资质续期工程师招聘时间策略

对于环保企业而言,在二级资质续期前启动工程师招聘的时间规划至关重要。考虑到招聘流程的复杂性、企业内部需求的变化以及政策标准的更新,建议环保企业在二级资质续期前至少提前6至12个月启动工程师招聘工作。这个时间规划可以细化为以下几个阶段: 一、前期准备阶段(提前6-12个月) 政策与标准研究: 深入研究国家和地方关于环保二级资质续期的最新政策、法规和标准,了解对工程师的具体要求。评估政策变化可

两道笔试题

“char a='\72'”是什么意思? 这么理解:\为转义字符,\072转义为一个八进制数072,也就是十进制数的58买一送一,将转义字符对照表也一并贴给你吧:转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) 008 \f 换页(FF) 012 \n 换行(LF) 010 \r 回车(CR) 013 \t 水平制表(HT) 009 \v 垂直制表(VT

华为23年笔试题

消息传输 题目描述 在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。 每个单元格可以有以下三种状态:  值 0 代表空地,无法传递信号;  值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔; 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms

实现的动态规划问题华为笔试题C++实现

秋招刷力扣题,我觉得我对动态规划不是熟练,在此处做总结 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。我觉得最大的问题就是对问题的分解,分解后的问题与分解前的问题具有相同的决策机制,将决策机制进行抽象,最终可以得到对应的解; 动态规划中开始介绍的爬楼梯等问题,答

某公司笔试编程题

参加了某公司编程题,这些题都来自牛客网,记录总结吧! 一、蛇形矩阵 题目描述 蛇形矩阵是有1开始的自然数依次排列成的一个上三角矩阵. 接口说明 void GetResult(int Num, int* pResult);输入参数:int Num :输入的正整数N输出参数:int *pResult: 指向放蛇形矩阵的字符串指针指针指向的内存区域保证有效 样例输入: 4

CVTE java web后台实习生笔试+技术一面总结

投的第一份简历,也可以说是第一次写笔试和参加面试。题在前面,总结在最后,努力不骗人。 笔试 题型:20道不定项选择题+2道算法题+1道架构设计题 选择题 选择题出的很全面,因为是不定项选择,一道题就可以考很多知识点。 当时做的时候以为笔试都是这么难,做完实验室同学告诉我这个算比较难的了,而且据我观察可能是跟春招找正式offer的一批难度的题。可能最后过的标准不一样吧。 选项信息量很大,

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述