20190806大疆笔试两题

一、爱玩游戏的小J

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
有许多程序员都热爱玩游戏游戏,而小J自称为游戏王,曾玩过几百种游戏,几乎所有能玩到的游戏大作都玩遍了。随着时间的推移,他发觉已经没有游戏可以让他玩了!于是他想改玩一些古老的游戏,以成为真正的“游戏王”。他希望在接下来的一段时间内将过去出的游戏全部玩一遍,但是毕竟时间有限,因此他感到很苦恼。于是他给每个游戏标上一个成就值,同时估算了完成这些游戏所需要的时间。
现在他只有X天时间。而每个游戏一旦开始玩,至少需要玩一天才能够停下来。那么,他所玩完的游戏的成就值之和最大能达到多少呢?(每个游戏必须玩完才能取得成值。)

输入
第一行输入case数T(0<T<20)。对于每个case,第一行输入游戏的数目N(0<N<11),总时间X(0<X<1000)用空格分隔。从第二行到第N+1行每行输入游戏的成就值Ai(0<Ai<10000),所需要花费时间Bi(0<Bi<10000)。

输出
对每个case输出一行,成就值之和的最大值。

样例输入
2
2 2
10 1
20 2
3 4
10 2
18 3
10 2

样例输出
20
20

作者:笨蛋蜘蛛
链接:https://www.nowcoder.com/discuss/218147?type=post&order=time&pos=&page=1
来源:牛客网

import java.util.Scanner;
 
public class dji {
 
public static void main(String[] args) {
 
 
    Scanner sc = new Scanner(System.in);
    int T = sc.nextInt();
    for (int j = 0; j < T; j++) {
        int N = sc.nextInt();
        int X = sc.nextInt();
        int[] Ai = new int[N];
        int[] Bi = new int[N];
        for (int i = 0; i < N; i++) {
            Ai[i] = sc.nextInt();
            Bi[i] = sc.nextInt();
        }
        dfs(N, X, Bi, Ai);
    }
    sc.close();
    }
     public static void dfs(int N, int X, int[] Ai, int[] Bi) {
    int []count = new int[X + 1];
    for (int m : count) {
        m = 0;
    }
    for (int i = 0; i < N; i++) {
        int w = Ai[i];
        int v = Bi[i];
        for (int j = X; j >= w; j--) {
            count[j] = Math.max(count[j], count[j - w] + v);
        }
    }
    System.out.println(count[X]);
     }
 
 
    }

大疆19年校招0806笔试B卷第一题(背包问题)

01背包问题——贪心+DP

二、不听话的机器人

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
小B平时喜欢倒腾一些小东西,最近他准备给自己做的小机器人加入一套语音控制的功能,每个指令对应一个动作。
由于语言转文字有很多现成的方案,所以小B打算直接复用这些方案,但是语音转成了文字之后,还需要将文字跟具体的动作对应起来。
因此小B需要实现一个函数,将语音转换出来的文字,再转换成相应的动作。
为了简单实现,小B将语音直接转成了拼音,然后把对应的动作也都起了名字,因此只要预先输入好两者的映射关系,然后输入语音指令就输出相应的动作。
然而因为小B的函数有bug,机器人并不想听他的话…
你能帮小B解决这个问题吗?

输入
输入包含多组测试数据,对于每组测试数据:
第一行输入两个正整数,空格隔开,需要进 行映射的命令的数目N 和进行调试时发送的语音指令条数 M (1 < N < 1000, 1 < M < 1000)
接下来N行,每行输入两个字符串表示语音指令和对应的动作cmd和action,以空格隔开,每个字符串的长度小于1000,且只有大小写字母
最后M行,每行输入一个字符串表示需要进行调试的语音指令

输出
对于每组测试数据:
输出M行,根据调试的语音指令输出对应的动作指令action

样例输入

4 4
ZuoZhuan TurnLeft
YouZhuan TurnRight
QianJin Forward
HouTui Backward
ZuoZhuan
QianJin
QianJin
HouTui
1 1
SDFlkjdf LNCIls
SDFlkjdf

样例输出
TurnLeft
Forward
Forward
Backward
LNCIls

个人写的没用任何技巧的代码

import java.util.Scanner;

public class main {
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			int N = sc.nextInt();
			int M = sc.nextInt();
			String[] cmd = new String[N];
			String[] action = new String[N];
			String[] ans = new String[M];
			for(int i=0;i<N;i++) {
				cmd[i] = sc.next();
				action[i] = sc.next();
			}
			for(int j=0;j<M;j++) {
				ans[j] = sc.next();
				for(int k=0;k<N;k++) {
					if(ans[j].equals(cmd[k])) {
						System.out.println(action[k]);
					}
				}
			}
		}
	}
}

牛客网上使用哈希表的解法

作者:笨蛋蜘蛛
链接:https://www.nowcoder.com/discuss/218147?type=post&order=time&pos=&page=1
来源:牛客网

import java.util.HashMap;
import java.util.Scanner;
 
public class dji1 {
public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc = new Scanner(System.in);
    while(sc.hasNext()){
      int n = sc.nextInt();
      int m = sc.nextInt();
       HashMapmap=new HashMap();
      for(int i=0;i<n;i++){
        String string1=sc.next();
        String string2=sc.next();
         map.put(string1, string2);
       }
     for(int j=0;j<m;j++){
       String string3=sc.next();
       if(map.get(string3)!=null)
         System.out.println(map.get(string3));
       }
          }
     sc.close();
     }
 
    }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值