拼多多笔试 拼多多笔试题 0817
笔试时间:2025年8月17日
往年笔试合集:
第一题
多多正在参加一个特殊的满减活动,有n个各不相同的商品,每个商品的价格是a_i。活动规则是——若挑选的两个商品的价格总和是m的倍数的话,可以免费带走这两个商品。由于多多最多只能带两个商品,请问多多有多少种组合方式免费带两个商品。
输入描述
第一行输入两个数字n和m。
接下来输入n个商品的价格a_i,a_i为整数。
1 ≤ n ≤ 200000,1 ≤ m < 200000,1 ≤ a_i ≤ 1000000000
输出描述
输出一个数字,表示多多能免费带走两个商品的方式数量。最终结果对998244353取模
样例输入
2 4
1 3
样例输出
1
解释: 多多只有1种方式免费拿走两件商品。第1件商品和第2件商品
参考题解
先把所有价格按给定数取模做频次统计;把余数为零的内部两两配对计入;对每个正余数只与它的补余配对;若给定数为偶数,再额外计算一半位置的内部配对;结果取指定模数。
C++:
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); const long long MOD = 998244353; int itemCount, modulus; if (!(cin >> itemCount >> modulus)) return 0; vector<long long> remainderFreq(modulus, 0); for (int i = 0; i < itemCount; ++i) { long long price; cin >> price; remainderFreq[price % modulus] += 1; } long long pairCount = 0; pairCount += remainderFreq[0] * (remainderFreq[0] - 1) / 2; for (int rem = 1; rem < (modulus + 1) / 2; ++rem) { pairCount += remainderFreq[rem] * remainderFreq[modulus - rem]; } if (modulus % 2 == 0) { int half = modulus / 2; pairCount += remainderFreq[half] * (remainderFreq[half] - 1) / 2; } cout << (pairCount % MOD) << "\n"; return 0; }
Java:
import java.io.*; import java.util.*; public class Main { static final long MOD = 998244353L; // 快速输入 static final class FastScanner { private final InputStream in; private final byte[] buffer = new byte[1 << 16]; private int ptr = 0, len = 0; FastScanner(InputStream is) { this.in = is; } private int read() throws IOException { if (ptr >= len) { len = in.read(buffer); ptr = 0; if (len <= 0) return -1; } return buffer[ptr++]; } int nextInt() throws IOException { int c, sgn = 1, x = 0; do { c = read(); } while (c <= 32 && c != -1); if (c == '-') { sgn = -1; c = read(); } while (c > 32 && c != -1) { x = x * 10 + (c - '0'); c = read(); } return x * sgn; } long nextLong() throws IOException { int c; long x = 0; int sgn = 1; do { c = read(); } while (c <= 32 && c != -1); if (c == '-') { sgn = -1; c = read(); } while (c > 32 && c != -1) { x = x * 10 + (c - '0'); c = read(); } return x * sgn; } } public static void main(String[] args) throws Exception { FastScanner fs = new FastScanner(System.in); int itemCount = fs.nextInt(); int modulus = fs.nextInt(); long[] remainderFreq = new long[modulus]; for (int i = 0; i < itemCount; i++) { long price = fs.nextLong(); int r = (int) ((price % modulus + modulus) % modulus); remainderFreq[r] += 1; } long pairCount = 0L; // r = 0 pairCount += remainderFreq[0] * (remainderFreq[0] - 1) / 2; // 1..(modulus-1)/2 for (int rem = 1; rem < (modulus + 1) / 2; rem++) { pairCount += remainderFreq[rem] * remainderFreq[modulus - rem]; } // rem = modulus/2 when modulus even if ((modulus & 1) == 0) { int half = modulus / 2; pairCount += remainderFreq[half] * (remainderFreq[half] - 1) / 2; } System.out.println(pairCount % MOD); } }
Python:
import sys def main(): data = list(map(int, sys.stdin.buffer.read().split())) it = iter(data) item_count = next(it) modulus = next(it) remainder_freq = [0] * modulus for _ in range(item_count): price = next(it) r = price % modulus remainder_freq[r] += 1 pair_count = 0 # r = 0 c0 = remainder_freq[0] pair_count += c0 * (c0 - 1) // 2 # 1..(modulus-1)//2 for rem in range(1, (modulus + 1) // 2): pair_count += remainder_freq[rem] * remainder_freq[modulus - rem] # rem = modulus//2 when modulus even if modulus % 2 == 0: half = modulus // 2 ch = remainder_freq[half] pair_count += ch * (ch - 1) // 2 print(pair_count % 998244353) if __name__ == "__main__": main()
第二题
多多先生经营着一个生机勃勃的多多果园。果园里不仅种满了各种果树,还吸引了许许多多可爱的小动物前来定居。最近,果园的收获季到了,多多先生收获了许多筐香甜的果实。在果园的一角,有一个存放备用果实的大仓库,仓库里有X筐果实。神奇的是,从第1天开始,每天早晨都会有一只新的小动物来到果园,希望能在这里定居。每只小动物的食量都不同。如果多多先生允许第i天来的小动物留下,那么这只小动物就会从“当天(第i天)”开始,一直到第n天结束,每天都需要吃掉c_i筐果实才能感到幸福。多多先生非常善良,他希望果园里的小动物越多越好。但是,他也必须保证每一只留在果园的小动物,从它来到的那天起直到第n天,每一天都能吃到足够的食物,绝不能有任何一只小动物挨饿。多多先生可以选择拒绝任何一只前来定居的小动物。被拒绝的小动物会默默地离开,不会消耗果园的任何果实。请问,在第n天结束时,多多先生的果园里最多能有多少只幸福的小动物?
输入描述
输入的第一行包含两个整数n和X(1≤n≤200000,1≤X≤10^18),分别表示果园收获季的总天数,以及初始时仓库里备用的果实筐数。
输入的第二行包含n个整数c_1, c_2, …, c_n(1≤c_i≤300),其中c_i表示第i天前来定居的小动物的每日食量。
数字之间用空格隔开。
输出描述
输出一个整数,表示在第n天结束时,在保证所有小动物每天都能吃饱、一直幸福的前提下,果园里所能拥有的小动物的最大数量。
样例输入
3 8
2 2 2
样例输出
2
参考题解
把每只对象的总消耗量等于到季末的天数乘以日需求,全部排序后从小到大贪心累加,直到超过总预算为止,累加数量即为答案。
C++:
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int dayCount; long long fruitStock; if (!(cin >> dayCount >> fruitStock)) return 0; vector<long long> dailyIntake(dayCount); for (int i = 0; i < dayCount; ++i) cin >> dailyIntake[i]; vector<long long> totalCost(dayCount); for (int i = 0; i < dayCount; ++i) totalCost[i] = dailyIntake[i] * 1LL * (dayCount - i); sort(totalCost.begin(), totalCost.end()); __int128 usedCost = 0; int maxCount = 0; for (long long cost : totalCost) { if (usedCost + cost <= (__int128)fruitStock) { usedCost += cost; ++maxCount; } else break; } cout << maxCount << "\n"; return 0; }
Java:
import java.io.*; import java.util.*; import java.math.BigInteger; public class Main { // 简单快速输入 static final class FastScanner { private final InputStream in; private final byte[] buf = new byte[1 << 16]; private int ptr = 0, len = 0; FastScanner(InputStream is) { this.in = is; } private int read() throws IOException { if (ptr >= len) { len = in.read(buf); ptr = 0; if (len <= 0) return -1; } return buf[ptr++]; } int nextInt() throws IOException { int c; do { c = read(); } while (c <= 32 && c != -1); int sgn = 1; if (c == '-') { sgn = -1; c = read(); } int x = 0; while (c > 32 && c != -1) { x = x * 10 + (c - '0'); c = read(); } return x * sgn; } long nextLong() throws IOException { int c; do { c = read(); } while (c <= 32 && c != -1); int sgn = 1; if (c == '-') { sgn = -1; c = read(); } long x = 0; while (c > 32 && c != -1) { x = x * 10 + (c - '0'); c = read(); } return x * sgn; } } public static void main(String[] args) throws Exception { FastScanner fs = new FastScanner(System.in); int dayCount = fs.nextInt(); long fruitStock = fs.nextLong(); long[] dailyIntake = new long[dayCount];
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南