拼多多历年秋招笔试真题
如需获取完整资料,请点击下方链接领取《2024校招笔试真题秘籍》(实时更新中)
不收费,3人组团即可一块免费领取!限量免费10000个名额
手机端点击免费领取:https://www.nowcoder.com/link/campus_xzbs2
电脑端请扫码领取:
1、回合制游戏
【题目描述】你在玩一个回合制角色扮演的游戏。现在你在准备一个策略,以便在最短的回合内击败敌方角色。在战斗开始时,敌人拥有HP格血量。当血量小于等于0时,敌人死去。一个缺乏经验的玩家可能简单地尝试每个回合都攻击。但是你知道辅助技能的重要性。
在你的每个回合开始时你可以选择以下两个动作之一:聚力或者攻击。
聚力会提高你下个回合攻击的伤害。
攻击会对敌人造成一定量的伤害。如果你上个回合使用了聚力,那这次攻击会对敌人造成buffedAttack点伤害。否则,会造成normalAttack点伤害。
给出血量HP和不同攻击的伤害,buffedAttack和normalAttack,返回你能杀死敌人的最小回合数。
输入描述:
第一行是一个数字HP
第二行是一个数字normalAttack
第三行是一个数字buffedAttack
1 <= HP,buffedAttack,normalAttack <= 10^9
输出描述:
输出一个数字表示最小回合数
输入样例:
13
3
5
输出样例:
5
【解题思路】
Dfs暴力搜索枚举所有可能的回合数,求出最小的回合数即可。
【参考代码】
#include <string> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <map> #include <sstream> #include <set> #include <stack> #include <cmath> #include <iomanip> using namespace std; int dfs(long HP,long nA,long bA,long cur){ int times1=0; int times2=0 ; if (cur < HP){ times1 = 1 + dfs(HP,nA,bA,cur+nA);// times2 = 2 + dfs(HP,nA,bA,cur+bA); return (times1<times2?times1:times2); } else return 0; } int main(){ long HP,nA,bA; while(cin>>HP>>nA>>bA){ int times ; bool flag = false; cout<<dfs(HP,nA,bA,0)<<endl; } return 0; }
2、种树
【题目描述】小多想在美化一下自己的庄园。他的庄园毗邻一条小河,他希望在河边种一排树,共 M 棵。小多采购了 N 个品种的树,每个品种的数量是 Ai (树的总数量恰好为 M)。但是他希望任意两棵相邻的树不是同一品种的。小多请你帮忙设计一种满足要求的种树方案。
输入描述:
第一行包含一个正整数 N,表示树的品种数量。
第二行包含 N 个正整数,第 i (1 <= i <= N) 个数表示第 i 个品种的树的数量。
数据范围:
1 <= N <= 1000
1 <= M <= 2000
输出描述:
输出一行,包含 M 个正整数,分别表示第 i 棵树的品种编号 (品种编号从1到 N)。若存在多种可行方案,则输出字典序最小的方案。若不存在满足条件的方案,则输出"-"。
输入样例:
3
4 2 1
输出样例:
1 2 1 2 1 3 1
【解题思路】
贪心,从前往后找当前第一种数量最多的数作为当前种的树。
【参考代码】
#include <algorithm> #include <cassert> #include <cstdio> #include <vector> using namespace std; const int N = 1000; const int M = 2000; int main() { int n, sum = 0, ma = 0; scanf("%d", &n); assert(n >= 1 && n <= N); vector<int> a(n); for (auto& x : a) { scanf("%d", &x); assert(x >= 1 && x <= M); sum += x; ma = max(ma, x); } assert(sum <= M); if (ma - (sum - ma) > 1) { puts("-"); return 0; } for (int prev = -1, k = 0; sum-- > 0; a[k]--, prev = k) { int ma = *max_element(a.begin(), a.end()); for (k = 0; k < n; ++k) { if (k == prev || a[k] == 0) continue; if (a[k] == ma || ma - (sum - ma) <= 1) break; } printf("%d%c", k + 1, sum == 0 ? '\n' : ' '); } }
3、选靓号
【题目描述】A 国的手机号码由且仅由 N 位十进制数字(0-9)组成。一个手机号码中有至少 K 位数字相同则被定义为靓号。A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号。
小多想花钱将自己的手机号码修改为一个靓号。修改号码中的一个数字需要花费的金额为新数字与旧数字之间的差值。比如将 1 修改为 6 或 6 修改为 1 都需要花 5 块钱。
给出小多现在的手机号码,问将其修改成一个靓号,最少需要多少钱?
输入描述:
第一行包含2个整数 N、K,分别表示手机号码数字个数以及靓号至少有 K 个数字相同。
第二行包含 N 个字符,每个字符都是一个数字('0'-'9'),数字之间没有任何其他空白符。表示小多的手机号码。
数据范围:
2 <= K <= N <= 10000
输出描述:
第一行包含一个整数,表示修改成一个靓号,最少需要的金额。
第二行包含 N 个数字字符,表示最少花费修改的新手机号。若有多个靓号花费都最少,则输出字典序最小的靓号。
输入样例:
6 5
787585
输出样例:
4
777577
说明:
花费为4的方案有两种:777577与777775,前者字典序更小。
【解题思路】
枚举可以改为的靓号和花费,使用优先队列(堆)维护。
【参考代码】
#include <cmath> #include <cstdio> #include <queue> #include <string> using namespace std; struc
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊由牛客官方团队打造,主要讲解名企校招技术岗位的笔试题,内容中包含多个名企的笔试真题,附有题目思路及参考代码