P13233 [GCJ 2015 Finals] Costly Binary Search
题目描述
你被要求实现可以说是最重要的算法之一:二分查找。更准确地说,你有一个已排序的对象数组,以及一个你想要插入到数组中的新对象。为了找到插入的位置,你可以将你的对象与数组中的对象进行比较。每次比较的结果要么是“更大”,意味着你的对象应该插入到被比较对象的右侧;要么是“更小”,意味着你的对象应该插入到被比较对象的左侧。为简化问题,比较结果不会出现“相等”。保证当你的对象大于数组中的某个对象时,也大于该对象左侧的所有对象;同理,当你的对象小于数组中的某个对象时,也小于该对象右侧的所有对象。如果数组有 $n$ 个元素,那么你的算法可能有 $n+1$ 种不同的结果。
在本题中,并非所有的比较花费都是相同的。更准确地说,将你的对象与数组中第 $i$ 个对象进行比较的代价为 $a_i$,其中 $a_i$ 是一个介于 1 到 9 之间的整数。
你的二分查找在最坏情况下的总代价是多少?假设你总是采用最优策略,尽量使最坏情况下的总代价最小。
输入格式
输入的第一行给出测试用例的数量 $T$。接下来有 $T$ 行,每行包含一个数字序列,描述一个测试用例的比较代价 $a_i$。数组的大小 $n$ 由该序列的长度给出。
输出格式
对于每个测试用例,输出一行,格式为 "Case #x: y",其中 $x$ 是测试用例编号(从 1 开始),$y$ 是最坏情况下二分查找的总代价。
说明/提示
**样例说明**
- $1 \leq T \leq 50$。
- 所有数字都在 1 到 9 之间。
- 每行数字之间没有空格。
**小数据集(8 分)**
- 时间限制:5 秒。
- $1 \leq n \leq 10^{4}$。
**大数据集(19 分)**
- 时间限制:30 秒。
- $1 \leq n \leq 10^{6}$。
由 ChatGPT 4.1 翻译