小欧的括号嵌套
题目描述
小欧想要构造一个合法的括号序列满足以下条件:
- 括号序列长度恰好为
2×n
。 - 括号序列的嵌套层数最大值为
r
。
括号嵌套层数是指在一个字符串中,以左括号 "(" 和右括号 ")" 形成的括号对的最大嵌套深度。
输入描述
一行两个整数 n, r(1 ≤ r ≤ n ≤ 10^5)
。
输出描述
一行一个字符串表示括号序列。若有多种构造方案,输出任意一个即可。
解题思路
构造一种特殊的满足条件的括号序列即可。
代码实现
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)
小欧的等差数列
题目描述
小欧有一个长度为 n
,首项为 a
,公差为 d
的等差数列。现在,小欧把这 n
个数看作一个集合,每次操作可以从集合中任意选两个数 a_i,a_j
,如果 a_i+a_j
是偶数,那么可以将 (a_i+a_j)/2
加入到集合中。小欧想知道,经过若干次操作后,集合中最多能有多少个数。
输入描述
一行三个整数 n, a, d
,表示等差数列的长度,首项和公差。
1 ≤ n ≤ 10^5
1 ≤ a,d ≤ 10^9
输出描述
输出一个整数,表示集合中最多能有多少个数。
解题思路
a_i + a_j
=a+i×d+a+j×d
- 若
i+j
为偶数,则(a_i+a_j)
为偶数,但(a_i+a_j)/2
已存在于集合中。 - 若
d
为偶数,则(a_i+a_j)
为偶数,此时(a_i+a_j)/2
不一定在集合中。 - 若由集合衍生的数
x
在a,a+d
之间,那么x
必然可以由a,a+d
衍生得到,a+k×d,a+(k+1)×d
同理。 - 所以,仅需考虑由
a,a+d
可以衍生得到多少数即可。 - 若
d
的因数包含2^k
,那么,由a,a+d
可以衍生得到2^k-1
个数,由集合可衍生得到的数的个数为(2^k-1) × (n-1)
。
代码实现
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)
。
小欧喝水
小欧拿了 n
个杯子排成了一排,其中有 k
个杯子装满了水,剩余的 n-k
个杯子为空的。小欧每回合的操作如下:
- 随机选择一个杯子。
- 杯子是空的。回合直接结束。
- 杯子是满的。如果小欧上一回合喝过了水,则回合结束;否则将喝完这杯水,回合结束。
小欧想知道,她喝完所有水的回合数期望是多少?
输入描述
两个正整数 n,k
,用空格隔开。
1≤ k ≤ n ≤ 10^6
输出描述
一个浮点数,代表期望的回合数。如果你的答案和正确答案的误差不超过 10^{-6}
,则认为答案正确。
解题思路
本题留给读者小试牛刀。
END
文章文档:公众号 字节幺零二四
回复关键字可获取本文文档。
题目来源:OPPO 2024届校招正式批笔试题-后端(C卷)
文章声明:题目来源 牛客 平台,如有侵权,请联系删除!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。