大疆19年校招0804笔试A卷

大疆笔试(客户端,Android),12道不定向选择。难度适中。三道编程,难度适中,照着3号的网易确实简单了不少。至少大多数是有思路的。

笔试题一:咖啡的香气

小名要调N个bug,喝一杯咖啡可以加速一个小时中调bug的速度A倍,一个小时内重复喝无效。一天最多工作八小时。每个bug初始的所需时间是 t1,t2,t3,…tn分钟。问是否可以解完所有的bug。

输入:
输入包含多组测试数据。每组测试数据:
第一行输入三个整数:N、A、X,分别代表需要解决的bug数量、喝咖啡之后效率提升的倍数、一天最多可以喝掉的咖啡数
第二行输入N个整数,表示在不喝咖啡的情况下解决这些八阿哥所需的时间t1, t2, …, tN
输出:
如果能在八小时内解决这些bug(如果时间为小数,向上取整),输出解决bug的时间,否则输出0

case:input:
8 2 8
60 60 60 60 60 60 60 60
4 3 3
333 77 100 13
output:
240
175

题目分析

这个题目可以过来想:喝一杯咖啡可以在一小时内加速A倍的调试速度,也可以理解成将时间延长A倍。故,只要是·所有的bug的总时长小于等于 X杯咖啡 * A倍加速 * 60 + (8 - X)* 60 ;就一定可以调完,反之调不完。

  1. 若是·所有的bug的总时长小于等于 X杯咖啡 * A倍加速 * 60 ,则总时长是 alltime / A(需注意不足一分钟的要进一位)
  2. 若是·所有的bug的总时长大于 X杯咖啡 * A倍加速 * 60 ,则总时长是 alltime - X * 60 * A + X * 60(喝咖啡的几个小时全部用光了,再加上不够的必须按原时间调bug的时间)

代码实现

//AC
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N, A, X;
        while (in.hasNext()) {
            N = in.nextInt();
            A = in.nextInt();
            X = in.nextInt();
            int alltime = 0;
            for (int i = 0; i < N; i++) {
                alltime += in.nextInt();
            }
            if (alltime <= X * 60 * A + (8 - X) * 60) {
                if (alltime <= X * 60 * A) {
                    if (alltime / A * A < alltime) {
                        System.out.println(alltime / A + 1);
                    } else
                        System.out.println(alltime / A);
                } else {
                    alltime = alltime - X * 60 * A + X * 60;
                    System.out.println(alltime);
                }
            } else
                System.out.println("0");
        }
    }
}

笔试题二:应该吃哪个呢

小明在购物架买东西,每个格子放着一种物品,上面标记价格,数目和满意度,小名总共有T的钱,他希望在T以内获得最大的满意度。零食必须整数倍购买,个数有限,卖完就没了。

输入:
输入包含多组测试数据,每组数据:
第一行输入两个整数T、N,分别代表钱数和零食种类数。
接下来的N行,每行输入三个整数ai, bi, ci(1 <= i <= N) ,代表零食的价格、零食的满意度、零食的数量
输出:
求出最大满意度

case:input
100 2
1 1 1
1 1 1
100 3
26 100 4
5 1 4
5 2 2
output
2
306 

题目分析

贪心算法,按照每单位价格的满意度进行排序,从大到小进行购买,直到遍历完所有的商品或者是T减为零。
这个题不知道为啥只过了50%,不知道哪里出了问题。

代码实现

//only pass 50%
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        class Food implements Comparable<Food> {
            int money;
            int value;
            int num;
            float count;

            public Food(int m, int v, int n) {
                this.money = m;
                this.value = v;
                this.num = n;
                this.count = (float) value / money;
            }

            @Override
            public int compareTo(Food o1) {
                if ((this.count - o1.count) >= 0)
                 //这个地方排序相差0.X的话也会变成返回零,表示相等,感觉大概率是这个问题,不过没法子去验证了
                 //写这一块之前还想着别忘了这个,写着写着就给忘了,改的话,大于零返回1,等于零返回0;
                    return (int) (this.count - o1.count);         
                else
                    return -1;
            }
        } 
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            int t = in.nextInt();
            boolean has = false; //是否购买
            Food foods[] = new Food[n];
            int allmoney = 0;
            int allvalue = 0;
            for (int i = 0; i < n; i++) {
                int money = in.nextInt();
                int value = in.nextInt();
                int num = in.nextInt();
                foods[i] = new Food(money, value, num);
                allmoney += money * num;
                allvalue += value * num;
            }
            if (allmoney <= t)
                System.out.println(allvalue);
            else {
                allvalue = 0;
                Arrays.sort(foods, 0, n);

                for (int i = n - 1; i >= 0; i--) {
                    int temp = foods[i].num;
                    for (int j = 0; j < temp; j++) {
                        if (t >= foods[i].money) {
                            has = true;
                            t -= foods[i].money;
                            allvalue += foods[i].value;
                            foods[i].num--;
                        }
                    }
                    if (t == 0)
                        break;
                }
                if (has)
                    System.out.println(allvalue);
                else
                    System.out.println("0");
            }
        }
    }
}

笔试题三:机器人大战

是一个单源最短路径算法问题,当时看到题目就退缩了。只大概的记录一下题目,没有代码实现。
N个路标从 1 到 N-1,机器人S只能沿直线从两个路标之间移动,且部分路标间不通。
S从0出发,裁判随机给出一个路标,要求S以最快速度到达。每轮都从0开始。用时最短的获胜。
每两个路标至少存在一条路径可以到达。
写程序实现。

输入:
第一行 N,P,C 三个数据,分别代表 路标个数,可以移动的路标的道路的数目,以及比赛的轮数。
接下来P行,每行三个整数 A,B,T,分别表示A到B所需的时间T。
接下里C行。每行一个正整数X ,表示每轮需要到达的路标编号。

输出:
输出C行,每行输出总时间最短是多少。

题目分析

应该使用 迪杰斯特拉算法 或者是 弗洛伊德算法 ,时间紧张没有调通。代码不贴了。

后记

还要接着练,还差得远了啊,加油!!!

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
根据题目要求,我们先来分析一下大疆创新校招笔试中关于C语言的问题。 大疆创新校招笔试中的C语言问题可能包括以下几个方面: 1.基础语法和数据类型:例如,询问C语言中的基本数据类型有哪些?如何定义和使用结构体? C语言中变量的声明和初始化的方式是什么?等等。 2.控制流程:例如,询问如何使用条件语句实现程序流程的控制?如何使用循环语句实现重复操作?等等。 3.函数和指针:例如,询问如何定义和调用函数?如何传递参数和返回值?指针的基本概念、用法及与数组的关系等等。 4.文件操作:例如,询问如何打开和关闭文件?如何读取和写入文件?等等。 针对这些问题,以下是一份可能的答案供参考: 1. C语言中的基本数据类型有 int、float、double、char等。结构体的定义和使用可以通过 struct关键字来创建自定义的数据类型,结构体中可以包含多个不同数据类型的成员变量。变量的声明和初始化可以在声明时进行初始化,例如:int a = 10;。 2. 使用条件语句 if-else 和 switch-case 可以实现程序流程的控制。 if-else 结构用于根据条件选择不同的执行路径, switch-case 结构则可以根据不同的值选择不同的执行路径。循环语句有 for 循环、while 循环和 do-while 循环,可以用于执行某段代码的重复操作。 3. 函数的定义和调用通过函数名、参数和返回值进行。可以使用函数原型先声明函数的返回类型、函数名和参数类型,然后在函数体内实现具体的功能。指针是用来存储内存地址的变量,可以通过指针间接访问和修改变量的值。指针和数组之间有着密切的关系,指针可以用来遍历数组中的元素。 4. 文件操作需要使用 FILE 类型的指针变量来表示文件,使用 fopen 函数打开文件并返回 FILE 类型的指针,使用 fclose 函数关闭文件。读取文件可以使用 fscanf 函数,写入文件可以使用 fprintf 函数。 这只是一个例子,实际上大疆创新校招笔试中的C语言问题可能更加复杂和多样化。在准备笔试之前,建议认真复习C语言的基础知识,多做一些相关的练习题目,加深对C语言的理解和掌握。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值