【笔试-算法】2026年字节跳动工程训练营笔试算法题

第一题 - 病毒杀灭

题意:初始1个病毒,第i天增加i²个。武器能杀k个。求不超过k的最大累积病毒数。

思路:模拟累加平方数,直到超过k。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;

int main()
{
int t;
cin >> t;

while (t--)
{
long long k;
cin >> k;

long long ans = 0;
long long i = 1;

while (ans + i * i < k)
{
ans += i * i;
i++;
}

cout << ans << endl;
}

return 0;
}

第二题 - 数组分块

题意:数组分为块,格式:k个1×1块 + (k-1)个2×1块 + … + 1个k×1块。输入n,输出k。

图示

思路:求 $\sum_{i=1}^{k}i(k+1-i) = n$

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;

int main()
{
long long n;
cin >> n;

long long left = 1, right = 1000000;
while (left < right)
{
long long mid = (left + right) / 2;
long long val = mid * (mid + 1) * (mid + 2) / 6;
if (val < n)
left = mid + 1;
else
right = mid;
}

cout << left << endl;

return 0;
}

第三题 - 区间操作

题意:长度a的零数组,进行b次操作。每次操作(l,r,n):在[l,r]内,找所有下标被n整除的位置,对应值+1。

思路:直接遍历[l,r],对于每个位置判断是否被n整除。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <vector>
using namespace std;

int main()
{
int a, b;
cin >> a >> b;

vector<int> arr(a + 1, 0); // 下标从1开始

for (int i = 0; i < b; i++)
{
int l, r, n;
cin >> l >> r >> n;

// 在[l, r]内找下标被n整除的位置
for (int j = l; j <= r; j++)
{
if (j % n == 0)
{
arr[j]++;
}
}
}

// 输出数组
for (int i = 1; i <= a; i++)
{
cout << arr[i];
if (i < a) cout << " ";
}
cout << endl;

return 0;
}