865 字
4 分钟
云智研发笔试

由于笔试是全屏,所以只提供思路

第一题#

题意描述#

有 tt 个样例

给你一个长度为 nn 的整数序列,问有多少对下标 (i,j),i<j(i,j), i \lt j 满足 a[i]+a[j]=a[i]⊕a[j]a[i] + a[j] = a[i] \oplus a[j]

数据范围#

  • 1≤t≤1001 \le t \le 100
  • 1≤n≤1031 \le n \le 10^3
  • 1≤∑n≤1031 \le \sum n \le 10^3
  • ai≥1a_i \ge 1

题解#

枚举#

时间复杂度 O(n2)O(n^2)

枚举 (i,j)(i,j) 二元组,满足条件便累加

代码如下

暂无

第二题#

题意描述#

给你三个数,分别是 n,m,kn, m, k ,分别表示有 nn 个人,这 nn 个人的编号为 1−n1-n,有 mm 个苹果,小明是编号是 kk 。

现在我们需要分配苹果,每个人至少分配一个,并且要保证相邻的两个人分配的苹果相差不能大于 11,求所有分配方案中,小明能分配到的最大苹果数量。

数据范围#

  • 1≤n≤1051 \le n \le 10^5
  • 1≤n≤m≤1091 \le n \le m \le 10^9
  • 1≤k≤n1 \le k \le n

题解#

二分#

时间复杂度 O(logm)O(logm)

假设我们知道小明拥有的苹果数,想要尽可能小明拥有的苹果数多,那么其他的的苹果数就尽可能少,同时需要满足相邻编号的人苹果数最多相差 11。

根据贪心性质,小明最多,编号左右两边按 1 递减,就好像一个单峰(山峰)一样。比如,小明 k = 3, n = 4, (1 2 3 2 1)的数据呈现是一个单峰

另外要注意,如果递减的过程中发现会 ≤0\le 0,此时需要分配苹果数为 11 (满足最少分配一个苹果的条件)

同时,也可以发现一个性质,如果小明分配的苹果越多,通过这种方式分配,可能苹果数不够,而小明分配的苹果越少,那么最后需要的苹果数可能是小于等于总苹果数的,如果是小于,我们把剩余的苹果从端点慢慢开始分配即可。比如:(1 2 3 2 1)剩余 4 -> (2, 2, 3, 2, 1) 剩余 3 -> …… -> (2, 3, 3, 3, 2) 剩余 0

综上,得到一个结果,可以通过二分小明的苹果数量,范围为 [1,m][1,m],然后计算一下通过贪心方式分配需要多少苹果,如果需要的苹果小于等于苹果总数,则舍弃左半区间,否则舍弃右半区间

代码如下

暂无

第三题#

题目大意#

由于长度为 nn 的字符串,只包含小写字母,求有多少个连续子串,其包含 rr 和 ee,但是不包含 dd

数据范围#

n≤30000n \le 30000

题解#

尺取#

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

从前往后扫描,设 pp 记录第 00 个位置(下标从 11 开始),或者当前遍历的位置,左边第一个 dd 的下标。设 r,er,e 分别记录从 p+1p + 1 开始 r,er,e 字符分别出现的最后位置。

如果当前 r,er,e 字符全部遍历到了,并且没有遍历到 dd,那么以当前下标为最后一个字符串的所有满足题意的连续字串数量为 min(r,e)−pmin(r,e) - p

如果当前遍历到了 dd,那么更新一下 p,r,ep, r, e 的值,因为后面的满足题意的字符一定不会包含当前字符。

代码如下

暂无

TIP

注意开 long

写在最后,题目不难,但是第二题第三题注意开 long