CF698C LRU

题目描述

在构建高负载系统时,缓存策略需要特别关注。本题关于最常用的缓存算法之一——LRU(最近最少使用算法)。 假设缓存最多可以存储 $k$ 个对象。开始时,缓存为空。当某个对象被请求时,我们会检查它是否已经在缓存中,如果不在则将其加入。如果此时缓存中的对象超过 $k$ 个,就需要移除最近最少使用的那个。换句话说,我们移除最后一次被请求时间最早的对象。 现在服务器上存储有 $n$ 个视频,且所有视频大小相同。缓存最多可存储 $k$ 个视频,使用上述缓存算法。我们已知,用户每次访问服务器都会以概率 $p_{i}$ 选择第 $i$ 个视频。视频的选择是独立且无记忆的。 你的任务是:对于每个视频,计算经过 $10^{100}$ 次查询后,它出现在缓存中的概率。

输入格式

输入的第一行包含两个整数 $n$ 和 $k$($1 \leq k \leq n \leq 20$)——视频的数量和缓存的容量。下一行包含 $n$ 个实数 $p_{i}$($0 \leq p_{i} \leq 1$),每个概率最多保留两位小数。 保证所有 $p_{i}$ 的和等于 $1$。

输出格式

输出 $n$ 个实数,第 $i$ 个数表示第 $i$ 个视频在 $10^{100}$ 次查询后仍保留在缓存中的概率。若你的答案与标准答案的绝对误差或相对误差不超过 $10^{-6}$,则视为正确。 即:假设你的答案为 $a$,标准答案为 $b$。若满足 $$ \frac{|a - b|}{\max(1, |b|)} \leq 10^{-6} $$ 则判为正确。

说明/提示

由 ChatGPT 5 翻译