笔试 | 大疆2021秋招笔试题及题解

DJI

文章首发于公众号”面鲸“,更多思路以及解法欢迎关注公众号!后台回复“联系”可添加小编微信加入面试笔试刷题交流群哦~

第一题

假设小杰有N个bug没有修,他每喝一杯咖啡(喝咖啡时间忽略不计),就给自己一个小时内的debug效率提升到原来的A倍,一小时内重复喝没用,最多只能喝X杯,喝太多了晚上会睡不着,并且为了可持续发展,每天最多只能工作X个小时,而在没喝咖啡的情况下解决每个bug所需要的时间为 t 1 , t 2 , . . . , t N t_1,t_2,...,t_N t1,t2,...,tN分钟。
现在是早上8点,小杰马上要开始一天的工作了,他计划按从1-N的顺序修复他头上的这些bug,你能帮他计算出他今天能在8小时内修完所有的bug么?如果能,最少需要多少时间?

输入描述

第一行三个整数N A X (1<=N<=100, 1<=A<=8, 1<=X<=8)

输出描述

输出一个数字T,如果不能解完所有的bug,则输出0,否则输出最少的分钟数。(T为正整数,如果不满一分钟则按一分钟计算,一旦超过8小时则认为不能解决,所以T最大为480)。

样例输入
  • 8 2 8
  • 60
  • 60
  • 60
  • 60
  • 60
  • 60
  • 60
  • 60
样例输出
  • 240
样例输入
  • 4 3 3
  • 333
  • 77
  • 100
  • 13
样例输出
  • 175
分析
  • 要最快地解决问题,当然是码足马力喝完X杯咖啡。
  • 喝完X杯咖啡之后,最多能完成的工作量是之前 A ∗ X ∗ 60 A*X*60 AX60分钟的工作量。
  • 那么就可以分为原工作量大于 A ∗ X ∗ 60 A*X*60 AX60以及不大于 A ∗ X ∗ 60 A*X*60 AX60两种。如果原来的工作量大于 A ∗ X ∗ 60 A*X*60 AX60,那么前X小时可以干 X ∗ 60 X*60 X60的工作量,剩下的时间只能慢慢按照原来的速度干活儿;如果原来的工作量小于等于 A ∗ X ∗ 60 A*X*60 AX60,那么最后所需要的时间就是原来所需时间的 1 / A 1/A 1/A
#include 
using namespace std;

int main() {
     
  int N, A, X, t, sum = 0;
  cin >> N >> A >> X;
  for (int i = 1; i <= N; i++) {
     
    cin >> t;
    sum += t;
  }
  if (sum <= A * X * 60) {
     
    cout << sum / A + (sum % A != 0) << endl;
  } else {
     
    int ans = X + sum - A * X * 60;
    cout << (ans <= 480 ? ans : 0) << endl;
  }
  return 0;
}

第二题

有一排零食格子,每一个里面都有零食,并标有对应的价格。小A每次只能从里面拿走总价格小于V的零食。对于每个零食,小A都有一个内心的满意度,小A希望每次都能吃上让自己最满意的零食。
假设零食柜里每个格子只放一种零食,每种零食的数量是有限的,买完就没有了,零食只能按照整数倍购买,不能只买半件,求在有限价格内能买到的零食的最高满意度是多少?

输入描述
  • 第一行两个整数N和T,N表示零食的种类数,T表示小A拥有的钱。(1<=N<=100, 1<=T<=10000)
  • 然后输入N行,每行三个正整数用空格分开,按顺序表示零食的价格v,满意度l和零食的数量c。(1<=v<=100, 1<=l<=100, 1<=c<=100)
输出描述
  • 对于每一组测试数据,输出一个正整数,如果无法购买任何一个零食则输出0,否则输出最大的满意度。
样例输入
  • 2 10
  • 1 1 1
  • 1 1 1
样例输出
  • 2
样例输入
  • 3 100
  • 26 100 4
  • 5 1 4
  • 5 2 2
样例输出
  • 306
分析
  • 当所有的c都等于1的时候,就是个0-1背包问题。
  • 而这题是一个多重背的模版题。基本的思路是可以将每一件物品分成若干件物品,使得原问题中第i种物品可取的每种策略(取 0 , 1 , . . . , c 0,1,...,c 0,1,...,c件)可以等同于取若干件代换之后的物品,进而转换为0-1背包问题。具体的解法可以在公众号后台回复“背包”获得完整版的《背包九讲》pdf。
#include 
using namespace std;

const int MAX_V = 1e4 + 5;

struct Item {
     
  int v, l;
  Item(int _v, int _l) : v(_v), l(_l) {
     }
};

vector<Item> items;
int dp[MAX_V];

int main() {
     
  int N, T, v, l, c;
  cin >> N >> T;
  for (int i = 1; i <= N; i++) {
     
    cin >> v >> l >> c;
    int count = 1;
    while (count <= c) {
     
      items.emplace_back(v * count, l * count);
      c -= count;
      count <<= 1;
    }
    if (c != 0) {
     
      items.emplace_back(v * c, l * c);
    }
  }
  memset(dp, 0, sizeof(dp));
  for (int i = 0; i < items.size(); i++) {
     
    for (int j = T; j >= items[i].v; j--) {
     
      dp[j] = max(dp[j], dp[j - items[i].v] + items[i].l);
    }
  }
  cout << dp[T] << endl;
  return 0;
}

欢迎扫码关注我们,在这里等你~
笔试 | 大疆2021秋招笔试题及题解_第1张图片

你可能感兴趣的:(笔试题解,算法,面试)