QOJ.ac

QOJ

时间限制: 30.0 s 内存限制: 256 MB 总分: 100

#17338. 要有光

统计

假设有一些光源和许多球形气球。所有光源的尺寸都足够小,可以建模为点光源,并且它们向所有方向发射光线。气球的表面吸收光线且不反射光线。令人惊讶的是,在这个世界中,气球可能会重叠。

你希望目标点处的总光照强度尽可能高。为此,可以移除一些阻挡光线的气球。然而,由于移除成本,可以移除的气球数量存在一定的限制。因此,你希望移除合适的一组气球,以使目标点处的总光照强度最大化。

下图展示了下面给出的样例输入中第一个数据集所指定的配置。该图显示了 $xy$ 平面,这已经足够了,因为在这个数据集中,所有光源、气球中心和目标点的 $z$ 坐标均为零。在图中,光源表示为星号,气球表示为圆圈。目标点位于原点,你最多可以移除 4 个气球。在这种情况下,图中的虚线圆圈对应于要移除的气球。

图 G.1:样例输入的第一个数据集。

输入格式

输入由一系列数据集组成。每个数据集的格式如下:

N M R
S1x S1y S1z S1r
...
SNx SNy SNz SNr
T1x T1y T1z T1b
...
TMx TMy TMz TMb
Ex Ey Ez

数据集的第一行包含三个正整数 $N$、$M$ 和 $R$,由单个空格分隔。$N$ 表示气球的数量,不超过 2000。$M$ 表示光源的数量,不超过 15。$R$ 表示可以移除的气球数量,不超过 $N$。

接下来的 $N$ 行中,每行包含四个由单个空格分隔的整数。$(S_{ix}, S_{iy}, S_{iz})$ 表示第 $i$ 个气球的中心位置,$S_{ir}$ 表示其半径。

接下来的 $M$ 行中,每行包含四个由单个空格分隔的整数。$(T_{jx}, T_{jy}, T_{jz})$ 表示第 $j$ 个光源的位置,$T_{jb}$ 表示其亮度。

数据集的最后一行包含三个由单个空格分隔的整数。$(E_x, E_y, E_z)$ 表示目标点的位置。

$S_{ix}, S_{iy}, S_{iz}, T_{jx}, T_{jy}, T_{jz}, E_x, E_y$ 和 $E_z$ 均大于 $-500$ 且小于 $500$。$S_{ir}$ 大于 $0$ 且小于 $500$。$T_{jb}$ 大于 $0$ 且小于 $80000$。

在目标点处,如果没有任何气球阻挡光线,来自第 $j$ 个光源的光照强度与距离的平方成反比,即:

$$\frac{T_{jb}}{(T_{jx} - E_x)^2 + (T_{jy} - E_y)^2 + (T_{jz} - E_z)^2}$$

总光照强度为上述各项之和。

你可以做出以下假设:

  • 目标点与任何光源之间的距离不小于 1。
  • 对于每个 $i$ 和 $j$,即使 $S_{ir}$ 改变了 $\epsilon$ ($|\epsilon| < 0.01$),第 $i$ 个气球是否遮挡第 $j$ 个光源的状态也不会改变。

输入结束的标志是包含三个零的一行。

输出格式

对于每个数据集,输出一行,包含一个十进制小数,表示移除最多 $R$ 个气球后,目标点处可能达到的最高总光照强度。输出的误差不应超过 $0.0001$。

样例

输入样例 1

12 5 4
0 10 0 1
1 5 0 2
1 4 0 2
0 0 0 2
10 0 0 1
3 -1 0 2
5 -1 0 2
10 10 0 15
0 -10 0 1
10 -10 0 1
-10 -10 0 1
10 10 0 1
0 10 0 240
10 0 0 200
10 -2 0 52
-10 0 0 100
1 1 0 2
0 0 0
12 5 4
0 10 0 1
1 5 0 2
1 4 0 2
0 0 0 2
10 0 0 1
3 -1 0 2
5 -1 0 2
10 10 0 15
0 -10 0 1
10 -10 0 1
-10 -10 0 1
10 10 0 1
0 10 0 260
10 0 0 200
10 -2 0 52
-10 0 0 100
1 1 0 2
0 0 0
5 1 3
1 2 0 2
-1 8 -1 8
-2 -3 5 6
-2 1 3 3
-4 2 3 5
1 1 2 7
0 0 0
5 1 2
1 2 0 2
-1 8 -1 8
-2 -3 5 6
-2 1 3 3
-4 2 3 5
1 1 2 7
0 0 0
0 0 0

输出样例 1

3.5
3.6
1.1666666666666667
0.0

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.