#P1873. The Fortified Forest
The Fortified Forest
描述
从前,在一个遥远的国度里住着一位国王。这位国王拥有一小片珍稀且价值连城的树木,这些树是他的祖先在旅途中收集来的。为了保护这些树不被盗,国王下令在周围建造一道高高的围栏。他的巫师被委以重任。
然而,巫师很快发现,建造围栏唯一可用的材料就是这些树木本身的木材。换句话说,必须砍掉一些树才能用它们的木材为剩下的树建造围栏。当然,为了避免掉脑袋,巫师希望被砍伐的树木总价值最小。巫师回到他的塔楼,潜心研究,直到找到最优的解决方案。围栏建成后,大家从此过上了幸福的生活。
你需要编写一个程序来解决巫师面临的问题。
输入
输入包含多个测试用例,每个用例描述一片假设的森林。每个测试用例的第一行是一个整数 ,表示森林中的树木数量。树木编号为 1 至 。接下来的 行每行包含 4 个整数 ,描述一棵树的信息:
- 表示树在平面上的坐标
- 表示树的价值
- 表示用该树的木材能建造的围栏长度
和 的取值范围是 0 到 10,000。
输入以 的空测试用例结束。
输出
对于每个测试用例,计算一个树木子集,使得:
- 用该子集的木材建造围栏,能围住剩下的所有树
- 该子集的总价值最小
- 如果存在多个最小价值子集,选择砍伐数量最少的那个
假设树的直径为 0(即视为点)。
输出格式如下:
- 测试用例编号(1, 2, ...)
- 被砍伐的树木编号
- 围栏材料的剩余长度(保留两位小数)
测试用例之间用空行分隔。
输入数据 1
6
0 0 8 3
1 4 3 2
2 1 7 1
4 1 2 3
3 5 4 6
2 3 9 8
3
3 0 10 2
5 5 20 25
7 -3 30 32
0
输出数据 1
Forest 1
Cut these trees: 2 4 5
Extra wood: 3.16
Forest 2
Cut these trees: 2
Extra wood: 15.00