笔试时间:2024年03月16日 历史笔试传送门:2023秋招笔试合集 第一题 题目:小美点外卖 小美是美团外卖的忠实用户,她经常去美团外卖 app 上面点外卖,因为会员红包的性价比太高啦!现在小美点了若干道菜,她希望你计算一个订单的总价。你能帮帮她吗? 输入描述 第一行输入一个正整数n,代表菜品总数。 第二行输入n个正整数,代表每道菜的价格。 第三行输入两个正整数x和y,x代表满减的价格,y代表红包的价格。 1<=n<=10^5 1<=x,y,ai<=10^9 保证所有的和大于,保证会用到满减。 输出描述 一个正整数,代表小美最终应付的钱数。 样例输入 4 10 20 10 20 25 10 样例输出 25 说明 四个菜一共 60 元,满减减掉了 25 元,再用一个 10 元的红包,因此需要付 25 元。 参考题解 直接统计所有的总价值,减去减免的价格即可。 C++:[此代码未进行大量数据的测试,仅供参考] #include <iostream>int main() { int num; std::cin >> num; long long sum = 0; for (int i = 0; i < num; ++i) { long long temp; std::cin >> temp; sum += temp; } long long l1, l2; std::cin >> l1 >> l2; sum = sum - l1 - l2; std::cout << sum << std::endl; return 0;} Java:[此代码未进行大量数据的测试,仅供参考] import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int num = in.nextInt(); long sum = 0l; for (int i = 0; i < num; i++) { long temp = in.nextLong(); sum += temp; } long l1 = in.nextLong(); long l2 = in.nextLong(); sum = sum - l1 - l2; System.out.println(sum); }} Python:[此代码未进行大量数据的测试,仅供参考] num = int(input())sum = 0for i in range(num): temp = int(input()) sum += templ1, l2 = map(int, input().split())sum = sum - l1 - l2print(sum) 第二题 题目:小美的合法单词 小美定义以下三种单词是合法的: 所有字母都是小写。例如:good 所有字母都是大写。例如:APP 第一个字母大写,后面所有字母都是小写。例如:Alice 现在小美拿到了一个单词,她每次操作可以修改任意一个字符的大小写。小美想知道最少操作几次可以使得单词变成合法的? 输入描述 一个仅由大写字母和小写字母组成的字符串,长度不超过10^5。 输出描述 一个整数,代表操作的最小次数。 样例输入 AbC 样例输出 1 说明 变成 ABC 或者 Abc 均可。只需要一次操作。 参考题解 统计大小写出现次数,取大改小,小改大,首字母是大写后边都改为小写三种取最小。 C++:[此代码未进行大量数据的测试,仅供参考] #include <iostream>#include <string>int main() { std::string s; std::getline(std::cin, s); int small = 0, big = 0; int res = s.length(); for (int i = 0; i < s.length(); ++i) { char ch = s[i]; if(ch >= 'a' && ch <= 'z') small++; else if(ch >= 'A' && ch <= 'Z') big++; } int temp = s.length(); if(s[0] >= 'A' && s[0] <= 'Z') temp = s.length() - 1 - small; res = std::min(std::min(small, big), temp); std::cout << res << std::endl; return 0;} Java:[此代码未进行大量数据的测试,仅供参考] import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 String s = in.nextLine(); int small = 0, big = 0; int res = s.length(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if(ch >= 'a' && ch <= 'z') small++; else if(ch >= 'A' && ch <= 'Z') big++; } int temp = s.length(); if(s.charAt(0) >= 'A' && s.charAt(0) <= 'Z') temp = s.length() - 1 - small; res = Math.min(Math.min(small, big), temp); System.out.println(res); }} Python:[此代码未进行大量数据的测试,仅供参考] s = input()small = sum(1 for ch in s if ch.islower())big = sum(1 for ch in s if ch.isupper())res = len(s)temp = len(s)if s[0].isupper(): temp = len(s) - 1 - smallres = min(min(small, big), temp)print(res) 第三题 题目:翻倍元素 小美拿到了一个数组,她每次操作会将除了第x个元素的其余元素翻倍,一共操作了q次。请你帮小美计算操作结束后所有元素之和。由于答案过大,请对10^9+7取模。 输入描述 第一行输入两个正整数n,q,代表数组的大小和操作次数。 第二行输入n个正整数ai,代表数组的元素。 接下来的q行,每行输入一个正整数xi,代表第i次操作未被翻倍的元素。 1<=n,q<=10^5,1<=xi<=n,1<=ai<=10^9 输出描述 一个整数,代表操作结束后所有元素之和模10^9+7的值。 样例输入 4 2 1 2 3 4 1 2 样例输出 34 说明:第一次操作后,数组变成[1,4,6,8],第二次操作后,数组变成[2,4,12,16],所有元素之和为 34。 参考题解 使用数组记录翻倍次数,结合快速幂进行优化; C++:[此代码未进行大量数据的测试,仅供参考] #include <iostream>#include <vector>const int MOD = 1000000007;long long powMod(long long x, int n, int MOD) { long long result = 1; x = x % MOD; while (n > 0) { if (n & 1) { result = (result * x) % MOD; } x = (x * x) % MOD; n >>= 1; } return result;}int main() { int n, q; std::cin >> n >> q; std::vector<int> nums(n); std::vector<int> times(n, q); for (int i = 0; i < n; ++i) { std::cin >> nums[i]; } for (int i = 0; i < q; ++i) { int x; std::cin >> x; times[x - 1]--; } long long sum = 0; for (int i = 0; i < n; ++i) { long long val = (long long)nums[i] * powMod(2, times[i], MOD) % MOD; sum = (sum + val) % MOD; } std::cout << sum << std::endl; return 0;} Java:[此代码未进行大量数据的测试,仅供参考] import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main { private static final int MOD = 1000000007; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int q = scanner.nextInt(); int[] nums = new int[n]; int[] times = new int[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); times[i] = q; } for (int i = 0; i < q; i++) { int x = scanner.nextInt(); times[x -