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多种语言分析,解答。
