luogu#P11589. [KTSC 2022 R2] 寻找魔法珠
[KTSC 2022 R2] 寻找魔法珠
题目背景
由于洛谷测试点大小限制,剩余数据可在此题评测
请使用 C++17 或 C++20 提交本题
你需要在程序开头加入如下代码:
#include <vector>
int count(std::vector<int> P);
题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 2차 선발고사 T2「 마법 구슬 찾기」
题目描述
你有 颗外观和质量完全相同的珠子,其中 颗是普通珠子, 颗是魔法珠子。你需要找到这颗魔法珠子,才能进入魔法城堡。
虽然无法通过肉眼区分魔法珠子和普通珠子,但你可以使用 个袋子来找到魔法珠子。袋子编号从 到 。
找到魔法珠子的步骤如下:
- 将所有珠子分装到 个袋子中。
- 每个袋子里必须有珠子,不能有空袋子。
- 袋子里只能装珠子,不能装其他袋子。
- 念咒语。
- 念咒语后:
- 不含魔法珠子的袋子里的珠子会全部消失。
- 含有魔法珠子的袋子里的珠子会因为魔法珠子的保护而不消失,但需要支付费用。若魔法珠子在第 个袋子中,且该袋子里有 颗珠子,则费用为 元。
魔法珠子永远不会消失,因此你可以重复上述步骤,直到只剩下魔法珠子。
你需要制定一个策略,将珠子分装到袋子中,以最小化在最坏情况下找到魔法珠子的费用。也就是说,无论哪颗珠子是魔法珠子,总费用不超过 元,找出最小的 。
请编写一个函数,解决 到 的所有 的问题。
你需要实现以下函数:
vector<long long> find_minimum_costs(int N, vector<int> A, vector<int> B);
N
:珠子的最大数量A, B
:长度为 的数组。对于每个 ,若魔法珠子在第 个袋子中,且该袋子里有 颗珠子,则费用为 元。- 该函数返回一个长度为 的数组 。对于每个 , 是在有 颗普通珠子和 颗魔法珠子的情况下,找到魔法珠子的最坏情况下的最小费用(单位:元)。
注意,提交的代码中不应包含任何输入输出操作。
输入格式
示例评测程序按以下格式读取输入:
- 第 行:
- 第 行:
输出格式
示例评测程序的输出格式如下:
- 第 行:
3 2
1 2
3 1
0
4
8
13 2
1 2
3 1
0
4
8
11
13
17
18
20
24
25
27
29
30
12 3
5 1
3 4
0 6
0
6
7
12
13
16
17
18
19
20
22
23
提示
样例解释 #1
考虑 的情况。
评测程序将调用如下函数:
find_minimum_costs(3, {1,3}, {2,1});
当 时,只有一颗珠子,即魔法珠子,因此费用为 元。
当 时,可以将两颗珠子分别放入两个袋子。若魔法珠子在第 个袋子中,费用为 元;若魔法珠子在第 个袋子中,费用为 元。因此,最坏情况下费用为 元。
当 时,可以采用以下策略。假设三颗珠子分别为 。
- 将 和 放入第 个袋子,将 放入第 个袋子,然后念咒语。
- 若魔法珠子在第 个袋子中,费用为 元,剩下 和 。然后将 放入第 个袋子,将 放入第 个袋子,再次念咒语。
- 若魔法珠子在第 个袋子中,费用为 元,剩下 。
- 若魔法珠子在第 个袋子中,费用为 元,剩下 。
- 若魔法珠子在第 个袋子中,费用为 元,剩下 。
在这种策略下,若 是魔法珠子,总费用为 元;若 是魔法珠子,总费用为 元;若 是魔法珠子,总费用为 元。因此,最坏情况下费用为 元。
函数应返回 [0,4,8]
。