diff --git a/P15823.cpp b/P15823.cpp new file mode 100644 index 0000000..ab82a87 --- /dev/null +++ b/P15823.cpp @@ -0,0 +1,48 @@ +#include +using namespace std; +int n, p, q; +int a[2005]; +int f[2005][2005]; +bool check(int w) { + for(int i = 0; i <= p; ++i) { + for(int j = 1; j <= n; ++j) { + f[i][j] = 0x7f7f7f7f; + } + } + for(int i = 1; i <= n; ++i) { + int s = upper_bound(a + 1, a + n + 1, a[i] - w) - a - 1; + int t = upper_bound(a + 1, a + n + 1, a[i] - 2 * w) - a - 1; + f[0][i] = f[0][t] + 1; + for(int j = 1; j <= p; ++j) { + f[j][i] = min(f[j - 1][s], f[j][t] + 1); + } + } + return f[p][n] <= q; +} +int main() { + scanf("%d%d%d", &n, &p, &q); + for (int i = 1; i <= n; ++i) + { + scanf("%d", &a[i]); + } + if (p + q >= n) + { // 若总数足够多,一个盯一个即可,固以下计算 p + q < 2000 + printf("1\n"); + return 0; + } + sort(a + 1, a + n + 1); + int l = 1, r = 1e9; + while(l < r) { + int mid = l + (r - l) / 2; + if(check(mid)) r = mid; + else l = mid + 1; + } + printf("%d\n", l); + return 0; +} +/* +f i, k为仅用 i 个小区间处理完前 k 个点所用最少的大区间个数。 + + +f{i, k} = min(f{i − 1, s}, f{i, t} + 1) +*/ \ No newline at end of file diff --git a/P15823.md b/P15823.md new file mode 100644 index 0000000..6433ffb --- /dev/null +++ b/P15823.md @@ -0,0 +1,95 @@ +# P15823 [JOI Open 2013] 观影 / Watching + +## 题目描述 + +澳大利亚有许多有趣的文化,例如各种体育运动和种类繁多的动物。你正试图观看在布里斯班的一条道路上举办的许多活动。 + +这条道路被划分为 $1\,000\,000\,000$ 个区段。这些区段从西到东编号为 $1, 2, \dots, 1\,000\,000\,000$。你想观看 $N$ 场活动。第 $i$ 场活动将在区段 $A_i$ 上举办。 + +为了观看这些活动,你准备了 $P$ 台小型摄像机和 $Q$ 台大型摄像机。你可以选择一个正整数 $w$ 作为拍摄参数。然后,一台小型摄像机可以拍摄**最多**连续 $w$ 个区段,一台大型摄像机可以拍摄**最多**连续 $2w$ 个区段。同一个区段可以被多台摄像机拍摄。你想拍摄所有举办活动的区段。由于预计会有很多人前往活动现场,出于安全考虑,你必须固定摄像机的位置,并且在活动期间不允许移动它们。参数 $w$ 越大,拍摄的成本就越高。因此,你希望最小化 $w$ 的值。 + +### 任务 + +编写一个程序,根据给定的活动信息和摄像机数量,确定能够拍摄所有活动所在区段所需的最小 $w$ 值。 + +## 输入格式 + +从标准输入读取以下数据。 + +- 输入的第一行包含三个以空格分隔的整数 $N, P, Q$。其中 $N$ 是活动的数量,$P$ 是小型摄像机的数量,$Q$ 是大型摄像机的数量。 +- 接下来的 $N$ 行中,第 $i$ 行($1 \le i \le N$)包含一个整数 $A_i$,表示第 $i$ 场活动举办的区段编号。 + +## 输出格式 + +向标准输出写入一个整数,表示能够拍摄所有活动所在区段所需的最小 $w$ 值。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +3 1 1 +2 +11 +17 +``` + +### 输出 #1 + +``` +4 +``` + +## 输入输出样例 #2 + +### 输入 #2 + +``` +13 3 2 +33 +66 +99 +10 +83 +68 +19 +83 +93 +53 +15 +66 +75 +``` + +### 输出 #2 + +``` +9 +``` + +## 说明/提示 + +### 样例解释 + +在第一个样例中,当你选择 $w = 4$ 时,就可以拍摄所有活动所在的区段。例如,你可以用一台小型摄像机拍摄从区段 1 到 3 的区域,用一台大型摄像机拍摄从区段 11 到 18 的区域。 + +### 约束条件 + +所有输入数据满足以下条件。 + +- $1 \le N \le 2000$。 +- $1 \le P \le 100\,000$。 +- $1 \le Q \le 100\,000$。 +- $1 \le A_i \le 1\,000\,000\,000$($1 \le i \le N$)。 + +### 子任务 + +#### 子任务 1 [50 分] + +- 满足 $N \le 100$。 + +#### 子任务 2 [50 分] + +- 无额外约束。 + +翻译由 DeepSeek V3.2 完成 \ No newline at end of file