整理了8道美团笔试真题,来试试自己水平有多厉害吧。
1、小美是美团的一名鲜花快递员,鲜花是一种保质期非常短的商品,所以需要尽快送到客户手中,公司对于骑手的一个要求就是要规划送花的线路,使得骑手送完所有订单走的路程尽可能少。(骑手开始派送时带走了所有需要派送的花,不必每单后返回花店,路程结算是从花店出发,到送完最后一名客户为止,不计算从最后一名客户家回到花店的时间)。
公司对于骑手的绩效评价是取决于两个指标,一是从花店到所有客户地址的距离之和,另一个是骑手实际走的路程。
设花店始终位于1号位置,客户共有n-1个,其编号为2~n。为了简化问题,我们约束这n个位置构成的是一棵树,即只有n-1条边在其中互相连接,且保证n个点彼此连通。
输入描述:
输出第一行包含一个正整数n,即花店和客户的总数。(1<=n<=30000)。
接下来有n-1行,每行有三个整数u,v,w,表示在u和v之间存在一条距离为w的道路。(1<=w<=1000)
输出描述:
输出包含两个整数,中间用空格隔开,分别表示花店到所有客户地址的距离之和和骑手实际走的路程。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner s= new Scanner(System.in);
int n=s.nextInt();
int alldis=0;
ArrayList<Edge>[] graph= new ArrayList[n+1];
for (int i=1;i<n+1;i++){
graph[i]=new ArrayList<Edge>();
}
for(int i=0;i<n-1;i++){
int num = s.nextInt();
int key = s.nextInt();
int value = s.nextInt();
alldis+=value;
graph[num].add(new Edge(key,value));
}
boolean[] hasVis = new boolean[n+1];
int[] allDis = new int[n + 1];
allDis[1]=0;
LinkedList<Node> queue = new LinkedList<>();
queue.offer(new Node(1,0,true));
while(!queue.isEmpty()){
Node tempNode = queue.poll();
int num=tempNode.num;
for (Edge edge:graph[num]){
int dis= tempNode.dis+edge.value;
if (!hasVis[edge.pointTo]){
queue.offer(new Node(edge.pointTo,dis,true));
allDis[edge.pointTo]=dis;
hasVis[edge.pointTo]=true;}
}
}
int max=0;
int sum=0;
for (int i&#