当前位置: 代码迷 >> 综合 >> 2020-08-16大疆笔试
  详细解决方案

2020-08-16大疆笔试

热度:47   发布时间:2024-02-11 20:15:19.0

题目描述:
最近DJI发布了一款Robomaster S1机器人,小伙伴们都沉迷其中不能自拔。小J为了能够在竞速比赛中迅速获胜,他决定利用开发的优势,在里面植入一套最优化的寻路算法。

比赛规则如下: 在比赛场地内预先设置N个路标,路标编号从0到N-1,S1只能沿直线在两个有连接的路标之间移动(部分路标之间是没有连接的) 比赛场地内的S1机器人从编号为0的路标出发,然后裁判给出随机一个路标(从0到N-1号路标中随机挑选一个)作为终点路标,要求S1机器人以尽可能快的速度从0号路标达到终点路标,总路程用时最短者获胜。

裁判会确保从0号路标和随机挑选的终点路标之间肯定存在至少一条路径。 小J在比赛开始前就已经得知了路标的数量 、通道的数量(每两个可以直接连接的路标点为一个通道)以及小车在每个通道上移动需要的时间。他需要编写一套算法,以确保能够快速找到最短路径,并输出小车在该路径移动所需要的时间,你能帮他实现这套算法吗?

输入描述
第一行输入两个个正整数 N和 P,其中N表示路标的数量, P表示通道的数量。 (1 < N <= 200,  0 <= P <= N * (N - 1) / 2 )

接下来的P行,每行输入三个正整数 A, B, T,A表示起点路标的编号,B表示终点路标的编号,T表示路标A到路标B需要时间T。 (0 <= A, B <= N-1, 1 <= T <= 100)

最后一行输入一个正整数 X,表示裁判给出的终点路标编号 (0 =< X <= N)

输出描述
输出一个正整数,表示小车从0号路标到X号路标之间移动的最短用时


样例输入
4 5
0 1 15
1 2 15
0 3 50
1 3 30
2 3 10
3

样例输出
40

import java.util.Scanner;public class 大疆_1 {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);int N=scanner.nextInt();int P=scanner.nextInt();int INFINITY=9999;int vexnum=N;  //结点数int v0=0,w,min;  //源点v0=0int G[][]=new int[N][N];  //路径权值int D[]=new int[vexnum]; //到各点的最短路径长度boolean S[]=new boolean[vexnum]; //true表示在S集合内for(int i=0;i<N;i++) {for(int j=0;j<N;j++) {G[i][j]=INFINITY;}}for(int i=0;i<P;i++) {int a=scanner.nextInt();int b=scanner.nextInt();int t=scanner.nextInt();G[a][b]=t;G[b][a]=t;}int X=scanner.nextInt();int v,i;for(v=0;v<vexnum;v++){S[v]=false; D[v]=G[v0][v];}D[v0]=0; S[v0]=true;     //初始化,v0入S集for(i=1;i<vexnum;i++){min=INFINITY;    //当前距v0的最近距离for(w=0;w<vexnum;w++){if(!S[w])   //在V-S集合中的顶点if(D[w]<min){   //w顶点离v0顶点更近v=w; min=D[w];}}S[v]=true;   //离v0最近的v点加入S集合for(w=0;w<vexnum;w++){  //更新当前最短路径及距离if(!S[w] && (min+G[v][w] < D[w])){D[w]=min+G[v][w];}}}System.out.println(D[X]);}
}

题目描述:
有许多程序员都热爱玩游戏,而小J自称为游戏王,曾玩过几百种游戏,几乎所有能玩到的游戏大作都玩遍了。随着时间的推移,他发觉已经没有游戏可以让他玩了!于是他想改玩一些古老的游戏,以成为真正的“游戏王”。他希望在接下来的一段时间内将过去出的游戏全部玩一遍,但是毕竟时间有限,因此他感到很苦恼。于是他想到一个计划,他先将每个游戏标上一个成就值,同时对每个游戏都估算一个通关所需要的天数,他计划在未来X天内让自己玩游戏的成就达到最大,那么他应该怎么做计划呢?(假设每个游戏最多只计划玩一遍,而且每个游戏必须玩完通关才能取得成就值,且通关每个游戏最小时间单位是1天)

输入描述
第一行输入两个整数N和X,中间用空格隔开,其中N表示游戏的数目N(1<=N<=10),X表示计划玩游戏的总时间天数 (1<=X<=1000)。

第二行输入第1个游戏的成就值A1(0<=A1<=10000) 和 通关所需要花费时间B1天 (1<=Bi<=500) 中间用空格隔开。

第N+1行输入第N游戏的成就值An(0<=An<=10000) 和 通关所需要花费时间Bn天(1<=Bn<=500) 中间用空格隔开

输出描述
可以达到成就之和的最大值。


样例输入
2 2
10 1
20 2
样例输出
20

提示
输入样例二:
3 4
10 2
18 3
10 2
输出样例二: 
20

import java.util.Scanner;public class 大疆_2 {public static void main(String[] args) {Scanner mysc=new Scanner(System.in);int num=mysc.nextInt();int day=mysc.nextInt();int []cj=new int[num];int []ts=new int[num];for(int i=0;i<num;i++) {cj[i]=mysc.nextInt();ts[i]=mysc.nextInt();}int dp[][]=new int[num+1][day+1];dp[0][0]=0;int res=0;for(int i=1;i<=num;i++) {for(int j=0;j<=day;j++) {if(ts[i-1]>j) {dp[i][j]=dp[i-1][j];}else {dp[i][j]=Math.max(dp[i-1][j-ts[i-1]]+cj[i-1], dp[i-1][j]);}res=Math.max(dp[i][j], res);}}System.out.println(res);}
}

题目描述:
小C平时最喜欢玩数字游戏,最近他碰到一道有趣的数字题,他和他的好朋友打赌,一定能在10分钟内解出这道题,成功完成,小C就可以得到好朋友送他的Switch游戏机啦,你能帮助小C赢得奖品吗?

题目是这样的:给定一个非负的、字符串形式的整形数字,例如“12353789”,字符串的长度也就是整形数字的位数不超过10000位,并且字符串不会以0开头,小C需要挑选出其中K个数字(K小于字符串的长度)并删掉他们,使得剩余字符组成新的整数是最小的。

输入描述
第一行输入一串纯数字形式的字符串,组成一个正整数

第二行输入一个正整数K (K < 字符串的长度) 

输出描述
输出一个数字(字符串格式)


样例输入
71245323308
4
样例输出
1223308

提示
输入样例二: 
1683212
3
输出样例二: 
1212 
输入样例三: 
100
1
输出样例三: 
0

import java.util.Scanner;public class 大疆_3 {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);String numString=scanner.nextLine();int k=scanner.nextInt();System.out.println(minRemoveKDigits(numString,k));}static String minRemoveKDigits(String num,int k) {int newLength=num.length()-k;char[] stack=new char[num.length()];int top=0;for(int i=0;i<num.length();i++) {char c=num.charAt(i);while(top>0 && stack[top-1]>c && k>0) {top--;k--;}stack[top++]=c;}int ofs=0;while(ofs<newLength && stack[ofs]=='0') {ofs++;}return ofs==newLength?"0":new String(stack,ofs,newLength-ofs);}
}