2023 拼多多笔试题 0312
笔试时间:2023年3月12日 春招实习
第一题
题目:飞机大战
多多最近下载了一款飞机大战的游戏,多多可以通过游戏上的不同发射按键来控制飞机发射子弹:
按下A键,飞机会发射出2枚子弹,每个子弹会对命中的敌人造成1点固定伤害,但不能作用于同个敌人。
按下B键,飞机会发射出1枚子弹,子弹会对命中的敌人造成巨额伤害并瞬间将其秒杀。
多多是个游戏高手,总是能操控子弹命中想要命中的敌人。这个游戏—共有T价关卡,消灭当前关卡全部敌人后,发射出去多余的子弹会消失,游戏会自动进入下一个关卡。假设每个关卡都会在屏幕中同时出现N个敌人,这N个敌人所能承受的伤害也已经知道。多多想知道,每个关卡自己最少按几次发射按键就可以将敌人全部消灭?
输入描述
第一行输入一个固定数字T表示关卡的总数量,N(1<=N<=200)表示每个关卡出现的敌人数量。
接下来T行,每行有N个数字D1,D2, ..... Dw(1<= Di <= 200)分别表示这N个敌人所能承受的伤害。
输出描述
结果共有N行,每行一个数字,分别表示对于这个关卡,最少按几次发射按键就可以将敌人全部消灭。
示例输入
3 3
1 2 1
2 3 2
1 2 3
示例输出
2
3
3
说明
游戏共有3个关卡,每个关卡会出现3个敌人。
第一个关卡,先按下A建控制子弹消灭第1个和第3个敌人后,再按下B键消灭第二个敌人。所以最少按2次。
第二个关卡,按下3次B键分别消灭这3个敌人。
第三个关卡,按下3次B键分别消灭这3个敌人。也可以按3次A建,敌人剩余承受伤害的变化为:[1, 2,3]->[1,1,2]→>[,0, 1] -> [0,0, 0]
参考题解
贪心。
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); int N = sc.nextInt(); for (int t = 0; t < T; t++) { int[] D = new int[N]; for (int i = 0; i < N; i++) { D[i] = sc.nextInt(); } Arrays.sort(D); int cnt = 0; int i = 0; while (i + 1 < N) { if (D[i] == 1 && D[i + 1] == 1) { cnt++; i += 2; } else { break; } } cnt += N - i; System.out.println(cnt); } } }
Python:[此代码未进行大量数据的测试,仅供参考]
T, N = map(int, input().split(" ")) for _ in range(T): D = [int(c) for c in input().split(" ")] D.sort() cnt = 0 i = 0 while i + 1 < N: if D[i] == D[i + 1] == 1: cnt += 1 i += 2 else: break cnt += N - i print(cnt)
第二题
题目:团建规划
又到了团建的时间,多多君负责安排这次的团建活动。多多君准备了三个活动(分别编号A、B和C),每个活动分别有人数上限以及每个人参加的费用。参加团建的有N个人(分别编号1~N),每个人先投票选择若干个意向的活动,最终每个人只能参加其中一个。多多君收集完投票结果后,发现如何安排成为了大难题:如何在满足所有人的意向的情况下,使得活动的总费用最少。于是多多君找到了擅长编程的你,希望你能帮助找到个合理的团建计划。
输入描述
第一行,一个整数N,代表准备参加活动的人数。(1<=N<=100 )
接下来N行,每行一个由"ABC"组成的字符串,其中第i行表示第i个人投票了哪几个活动。
(输入保证字符串非空,且由大写的"ABC"字符组成)
最后3行,每行两个整数,分别表示三个活动的人数上限以及每个人参加的费用。
(人数上限以及参与活动的费用均为不超过100的正整数)
输出描述
输出共2行
如果能满足所有人的要求,第一行输出"YES”,第二行输出最少的总费用。
如果不能满足所有人的要求,第一行输出"NO,第二行输出最多能满足多少人。
示例输入
示例输入一:
5
A
B
C
AB
ABC
2 1
2 2
2 3
示例输入二:
5
A
B
C
AB
AB
1 1
2 2
3 3
示例输出
示例输出一:
YES
9
示例输出二:
NO
4
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <deque> #include <unordered_map> const int INF = std::numeric_limits<int>::max(); struct Edge { int from, to, capacity, weight; Edge(int u, int v, int c, int w) : from(u), to(v), capacity(c), weight(w) {} }; std::vector<std::vector<int>> graph; std::vector<Edge> edges; void add_edge(int u, int v, int c, int w) { edges.push_back(Edge(u, v, c, w)); edges.push_back(Edge(v, u, 0, -w)); graph[u].push_back(edges.size() - 2); graph[v].push_back(edges.size() - 1); } std::tuple<bool, std::vector<int>, std::vector<int>> spfa(int source, int sink, int n) { std::vector<int> dist(n + 1, INF); std::vector<bool> visited(n + 1, false); std::vector<bool> in_queue(n + 1, false); std::vector<int> pre_edge(n + 1, -1); dist[source] = 0; std::deque<int> q; q.push_back(source); in_queue[source] = true; while (!q.empty()) { int u = q.front(); q.pop_front(); in_queue[u] = false; visited[u] = true; for (int i : graph[u]) { int v = edges[i].to, c = edges[i].capacity, w = edges[i].weight; if (c > 0 && dist[u] + w < dist[v]) { dist[v] = dist[u] + w; pre_edge[v] = i; if (!in_queue[v]) { q.push_back(v); in_queue[v] = true; } } } } return std::make_tuple(visited[sink], dist, pre_edge); } std::pair<int, int> mcmf(int source, int sink, int n) { int max_flow = 0, min_cost = 0; while (true)
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。