CF1672E notepad.exe
题目描述
这是一个交互题。
有 $n$ 个单词在一个文本编辑器中。第 $i$ 个单词的长度为 $l_i$($1 \leq l_i \leq 2000$)。数组 $l$ 是隐藏的,只有评测器知道。
文本编辑器以多行显示单词,每行中相邻两个单词之间至少有一个空格。注意,一行末尾不一定要有空格。我们将文本编辑器的高度定义为所用的行数。对于给定的宽度,文本编辑器会以使高度最小的方式显示单词。
更正式地,假设文本编辑器的宽度为 $w$。令 $a$ 为长度为 $k+1$ 的数组,满足 $1=a_1 < a_2 < \ldots < a_{k+1}=n+1$。如果对于所有 $1 \leq i \leq k$,都有 $l_{a_i}+1+l_{a_i+1}+1+\ldots+1+l_{a_{i+1}-1} \leq w$,则 $a$ 是一个合法的数组。则文本编辑器的高度为所有合法数组中 $k$ 的最小值。
注意,如果 $w < \max(l_i)$,则文本编辑器无法正常显示所有单词,会崩溃,此时文本编辑器的高度为 $0$。
你可以询问 $n+30$ 次。在一次询问中,你给出一个宽度 $w$,评测器会返回当宽度为 $w$ 时文本编辑器的高度 $h_w$。
请你求出文本编辑器的最小面积,即所有 $h_w \neq 0$ 的 $w \cdot h_w$ 的最小值。
单词长度在测试开始前就已确定。也就是说,交互器不是自适应的。
输入格式
输入的第一行包含一个整数 $n$($1 \leq n \leq 2000$),表示文本编辑器中的单词数。
保证隐藏的长度 $l_i$ 满足 $1 \leq l_i \leq 2000$。
输出格式
首先读入 $n$。
每次询问时,输出 "? $w$"(不含引号,$1 \leq w \leq 10^9$)。然后你应从标准输入读取我们的回复,即 $h_w$。
如果你的程序进行了非法的询问或超出了询问次数限制,交互器会立即终止,你的程序会得到 Wrong answer 的判定。
最终输出答案时,输出 "! $area$"(不含引号)。注意,输出最终答案不计入 $n+30$ 次询问限制。
每次输出询问后不要忘记换行并刷新输出缓冲区,否则会得到 Idleness limit exceeded 的判定。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请查阅相关文档。
Hacks
输入的第一行必须是一个整数 $n$($1 \leq n \leq 2000$),表示文本编辑器中的单词数。
输入的第二行必须是 $n$ 个用空格分隔的整数 $l_1,l_2,\ldots,l_n$($1 \leq l_i \leq 2000$)。
说明/提示
在第一个测试用例中,单词为 $\{\texttt{glory},\texttt{to},\texttt{ukraine},\texttt{and},\texttt{anton},\texttt{trygub}\}$,所以 $l=\{5,2,7,3,5,6\}$。
如果 $w=1$,则文本编辑器无法正常显示所有单词,会崩溃。此时高度 $h_1=0$,评测器会返回 $0$。
如果 $w=9$,文本编辑器可能的显示方式为:
- $\texttt{glory\_\_to}$
- $\texttt{ukraine\_\_}$
- $\texttt{and\_anton}$
- $\texttt{\_\_trygub\_}$
此时高度 $h_9=4$,评测器会返回 $4$。
如果 $w=16$,文本编辑器可能的显示方式为:
- $\texttt{glory\_to\_ukraine}$
- $\texttt{and\_anton\_trygub}$
此时高度 $h_{16}=2$,评测器会返回 $2$。
假设我们已经求出文本编辑器的最小面积为 $32$,则输出答案。
由 ChatGPT 4.1 翻译