From abbe51ca27afd151e7efbd4fcc617cbc328c94ea Mon Sep 17 00:00:00 2001 From: hanyixuanten <105723997+hanyixuanten@users.noreply.github.com> Date: Fri, 9 Oct 2026 18:06:05 +0800 Subject: [PATCH] new file: P1378.cpp --- P1378.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ P1378.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 P1378.cpp create mode 100644 P1378.md diff --git a/P1378.cpp b/P1378.cpp new file mode 100644 index 0000000..5eee424 --- /dev/null +++ b/P1378.cpp @@ -0,0 +1,54 @@ +#include +using namespace std; +int n; +pair dro[10]; +bool used[10]; +double siz; +double r[10]; +int x, y, xx, yy; +double calc(int a, int b) { + return sqrt((dro[a].first - dro[b].first) * (dro[a].first - dro[b].first) + + (dro[a].second - dro[b].second) * + (dro[a].second - dro[b].second)) - + r[b]; +} +double ans = 4e6; +void dfs(int now, int cnt) { + used[now] = 1; + double maxd = min(min(abs(dro[now].first - x), abs(dro[now].first - xx)), + min(abs(dro[now].second - y), abs(dro[now].second - yy))); + for (int i = 1; i <= n; ++i) { + if (used[i] && i != now) + maxd = min(maxd, calc(now, i)); + } + if (maxd < 0) + maxd = 0; + r[now] = maxd; + siz -= 3.1415926 * maxd * maxd; + if (cnt == n) { + ans = min(ans, siz); + + } else { + for (int i = 1; i <= n; ++i) { + if (!used[i]) + dfs(i, cnt + 1); + } + } + siz += 3.1415926 * maxd * maxd; + used[now] = 0; +} +int main() { + scanf("%d", &n); + scanf("%d%d%d%d", &x, &y, &xx, &yy); + x += 1000, y += 1000, xx += 1000, yy += 1000; + siz = abs((x - xx) * (y - yy)); + for (int i = 1; i <= n; ++i) { + scanf("%d%d", &dro[i].first, &dro[i].second); + dro[i].first += 1000, dro[i].second += 1000; + } + for (int i = 1; i <= n; ++i) { + dfs(i, 1); + } + printf("%.0lf\n", ans); + return 0; +} \ No newline at end of file diff --git a/P1378.md b/P1378.md new file mode 100644 index 0000000..8564720 --- /dev/null +++ b/P1378.md @@ -0,0 +1,42 @@ +# P1378 油滴扩展 + +## 题目描述 + +在一个长方形框子里,最多有 $N$ 个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这 $N$ 个点上放置油滴,才能使放置完毕后所有油滴占据的总面积最大呢?(不同的油滴不会相互融合) + +注:圆的面积公式 $S = \pi r^2$,其中 $r$ 为圆的半径。 + +## 输入格式 + +第一行,一个整数 $N$。 + +第二行,四个整数 $x, y, x', y'$,表示长方形边框一个顶点及其对角顶点的坐标。 + +接下来 $N$ 行,第 $i$ 行两个整数 $x_i, y_i$,表示盒子内第 $i$ 个点的坐标。 + +## 输出格式 + +一行,一个整数,长方形盒子剩余的最小空间(结果四舍五入输出)。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +2 +20 0 10 10 +13 3 +17 7 + +``` + +### 输出 #1 + +``` +50 + +``` + +## 说明/提示 + +对于 $100\%$ 的数据,$1 \le N \le 6$,坐标范围在 $[-1000, 1000]$ 内。 \ No newline at end of file