OPPO 2024届校招正式批笔试题-后端(C卷)

小欧的括号嵌套

题目描述

小欧想要构造一个合法的括号序列满足以下条件:

  • 括号序列长度恰好为 2 × n 2×n 2×n。
  • 括号序列的嵌套层数最大值为 r r r。

括号嵌套层数是指在一个字符串中,以左括号 "(" 和右括号 ")" 形成的括号对的最大嵌套深度。

输入描述

一行两个整数 n , r ( 1 ≤ r ≤ n ≤ 1 0 5 ) n, r(1 ≤ r ≤ n ≤ 10^5) n,r(1≤r≤n≤105)。

输出描述

一行一个字符串表示括号序列。若有多种构造方案,输出任意一个即可。

解题思路

构造一种特殊的满足条件的括号序列即可。

代码实现
c 复制代码
int main() {
    int n, r;
    scanf("%d%d", &n, &r);
    string s = string(r, '(') + string(r, ')');
    for (int k = n / r; k-- > 0; cout << s);
    cout << string(n % r, '(') + string(n % r, ')');
    return 0;
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

小欧的等差数列

题目描述

小欧有一个长度为 n n n,首项为 a a a,公差为 d d d 的等差数列。现在,小欧把这 n n n 个数看作一个集合,每次操作可以从集合中任意选两个数 a i , a j a_i,a_j ai,aj,如果 a i + a j a_i+a_j ai+aj 是偶数,那么可以将 ( a i + a j ) / 2 (a_i+a_j)/2 (ai+aj)/2 加入到集合中。小欧想知道,经过若干次操作后,集合中最多能有多少个数。

输入描述

一行三个整数 n , a , d n, a, d n,a,d,表示等差数列的长度,首项和公差。

  • 1 ≤ n ≤ 1 0 5 1 ≤ n ≤ 10^5 1≤n≤105
  • 1 ≤ a , d ≤ 1 0 9 1 ≤ a, d ≤ 10^9 1≤a,d≤109
输出描述

输出一个整数,表示集合中最多能有多少个数。

解题思路
  • a i + a j a_i + a_j ai+aj = a + i × d + a + j × d a+i×d+a+j×d a+i×d+a+j×d
  • 若 i + j i+j i+j 为偶数,则 ( a i + a j ) (a_i+a_j) (ai+aj) 为偶数,但 ( a i + a j ) / 2 (a_i+a_j)/2 (ai+aj)/2 已存在于集合中。
  • 若 d d d 为偶数,则 ( a i + a j ) (a_i+a_j) (ai+aj) 为偶数,此时 ( a i + a j ) / 2 (a_i+a_j)/2 (ai+aj)/2 不一定在集合中。
  • 若由集合衍生的数 x x x 在 a , a + d a,a+d a,a+d 之间,那么 x x x 必然可以由 a , a + d a,a+d a,a+d 衍生得到, a + k × d , a + ( k + 1 ) × d a+k×d,a+(k+1)×d a+k×d,a+(k+1)×d 同理。
  • 所以,仅需考虑由 a , a + d a,a+d a,a+d 可以衍生得到多少数即可。
  • 若 d d d 的因数包含 2 k 2^k 2k,那么,由 a , a + d a,a+d a,a+d 可以衍生得到 2 k − 1 2^k-1 2k−1 个数,由集合可衍生得到的数的个数为 ( 2 k − 1 ) × ( n − 1 ) (2^k-1) × (n-1) (2k−1)×(n−1)。
代码实现
c 复制代码
int main() {
    long long n, a, d, k = 0;
    cin >> n >> a >> d;
    while (!(d & 1))k++, d >>= 1;
    cout << n + ((1 << k) - 1) * (n - 1);
    return 0;
}

时间复杂度: O ( 1 ) O(1) O(1)。

空间复杂度: O ( 1 ) O(1) O(1)。

小欧喝水

小欧拿了 n n n 个杯子排成了一排,其中有 k k k 个杯子装满了水,剩余的 n − k n-k n−k 个杯子为空的。小欧每回合的操作如下:

  1. 随机选择一个杯子。
  2. 杯子是空的。回合直接结束。
  3. 杯子是满的。如果小欧上一回合喝过了水,则回合结束;否则将喝完这杯水,回合结束。

小欧想知道,她喝完所有水的回合数期望是多少?

输入描述

两个正整数 n , k n,k n,k,用空格隔开。

  • 1 ≤ k ≤ n ≤ 1 0 6 1≤ k ≤ n ≤ 10^6 1≤k≤n≤106
输出描述

一个浮点数,代表期望的回合数。如果你的答案和正确答案的误差不超过 1 0 − 6 10^{-6} 10−6,则认为答案正确。

解题思路

本题留给读者小试牛刀。

END

题目来源:OPPO 2024届校招正式批笔试题-后端(C卷)

文章声明:题目来源 牛客 平台,如有侵权,请联系删除!

相关推荐
weixin_3077791317 分钟前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab
不穿鞋的懒羊羊42 分钟前
dfs深度优先搜索
算法
OYYHXPJR1 小时前
【算法】区间重叠模板和矩形重叠模板
算法
shehuiyuelaiyuehao1 小时前
算法46,分治快排,排序数组
java·算法·排序算法·排序
远航计算机1 小时前
GEO 选题从哪来?用一份 Query 词库把一年内容排出来
大数据·人工智能·算法·aigc
宣宣猪的小花园.1 小时前
【机器学习】神经网络与表征:为什么深度学习能自动提取特征
人工智能·嵌入式硬件·算法·机器学习
mmmmath_32 小时前
LeetCode.018.四数之和
数据结构·算法·leetcode
AIGCmagic社区2 小时前
腾讯混元 AuK 技术报告拆读:1.5B 统一语音生成与编辑,蒸馏后 4 步无 CFG 提速 4.5 倍
人工智能·算法·aigc·ai多模态
大熊背2 小时前
基于照明色度表征的颜色恒常性的白平衡算法实现
算法·白平衡·色温·色度坐标·普朗克曲线
高亦真2 小时前
今天是学习嵌入式的第38天
linux·学习·算法