oppo笔试 oppo笔试题 0728
笔试时间:2024年07月28日 提前批
历史笔试传送门:2023秋招笔试合集
第一题
题目:分糖果
小o有三盒糖果,糖果数分别为a,b和c。现在小0又有了x颗糖果,他要把这x颗糖果恰好分到新的k个盒子里面去,保证每一个盒子里至少有一颗糖果。这样他就拥有了k+3盒糖果,然后他会在这k+3盒糖果中挑选出最多的那一盒糖果。显然,x颗糖果分到k个盒子里往往不止一种方案。小0想知道,无论他如何分配这x颗糖果,糖果最多的那一个盒子的编号是否确定目唯一。
输入描述
第一行输入三个整数 a,b和c(1<=a,b,c<=10^9)表示初始三盒糖果的个数。
第二行输入两个整数x和k(1<=k<=x<=10^9)代表小O新获得的糖果个数,和需要新放人糖果的盒子数。
输出描述
如果糖果最多的那一个盒子的编号确定且唯一,输出“YES”,否则,输出“NO”。
样例输入
423
22
样例输出
YES
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <algorithm> int main() { vector<int> arr; string input_line; getline(std::cin, input_line); istringstream iss(input_line); int num; while (iss >> num) { arr.push_back(num); } int x, k; cin >> x >> k; int max_value = *std::max_element(arr.begin(), arr.end()); // 判断条件并输出结果 if (max_value > 1 + x - k) { cout << "Yes" << std::endl; } else { cout << "No" << std::endl; } return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取数组输入 String[] arrStr = scanner.nextLine().split(" "); int[] arr = new int[arrStr.length]; for (int i = 0; i < arrStr.length; i++) { arr[i] = Integer.parseInt(arrStr[i]); } // 读取 x 和 k int x = scanner.nextInt(); int k = scanner.nextInt(); // 找到数组中的最大值 int maxValue = Arrays.stream(arr).max().getAsInt(); // 判断条件并输出结果 if (maxValue > 1 + x - k) { System.out.println("Yes"); } else { System.out.println("No"); } scanner.close(); } }
Python:[此代码未进行大量数据的测试,仅供参考]
arr = [int(c) for c in input().split()] x,k = map(int, input().split()) if max(arr) > 1 + x-k: print("Yes") else: print("No")
第二题
题目
小o有两个长度为n的数组,现在她想从这两个数组中分别选出一个非空子序列,使得从第一个数组中选出的子序列的最大值不大于从第二个数组中选出的子序列的最小值。小o想知道两个子序列的长度之和最大是多少。如果数组a可以通过删除数组b中的若干(可能为零或全部)元素得到,则数组 a是数组b的子序列。
输入描述
第一行输入一个整数n(l<=n<=10^5)代表数组的长度。
第二行输入几个整数a1,a2,...,an(1<=ai<=10^9)代表第一个数组。
第三行输入几个整数b1,b2,…,bn(1<=bi<=10^9)代表第二个数组。
输出描述
在一行上输出一个整数,表示两个子序列的长度之和最大是多少。如果无法选出满足条件的子序列,则输出-1。
样例输入
4
1 2 3 4
3 4 5 6
样例输出
7
参考题解
二分+枚举。首先将两个数组排序。要找到所有满足条件最长的那个,我们可以通过枚举第一个数组中的最大值来进行。假设枚举当前第一个数组的最大值为a,那么二分来找到第二个数组中,大于等于a的最小值,叠加这两个子序列的长度,更新最大值即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <algorithm> int main() { int n; std::cin >> n; std::vector<int> A(n), B(n); for (int i = 0; i < n; ++i) std::cin >> A[i]; for (int i = 0; i < n; ++i) std::cin >> B[i]; std::sort(A.begin(), A.end()); std::sort(B.begin(), B.end()); int ans = 0; for (int i = 0; i < n; ++i) { int a = A[i]; int l = 0, r = n; while (l < r) { int mid = (l + r) / 2; if (B[mid] >= a) r = mid; else l = mid + 1; } ans = std::max(ans, i + 1 + n - r); } std::cout << a
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。