《算法艺术与信息学竞赛》之 贪心 例二 Enlightened landscape

Enlightened landscape

Consider a landscape composed of connected line segments:

Above the landscape, N light bulbs are hang at the same height T in various horizontal positions. The purpose of these light bulbs is to light up the entire landscape. A landscape point is considered lit if it can “see” a light bulb directly, that is, if the line segment which links the point with a bulb does not contain any other landscape segments point.
Task

Write a program that determines the mi-ni-mum number of light bulbs that must be switched on in order to illuminate the entire landscape.
Input

Input file name: LIGHT.IN
Line 1: M
An integer, the number of landscape height specifications, including the first and the last point of the landscape.
Lines 2..M+1: Xi Hi
Two integers, separated by a space: the landscape height Hi at horizontal position Xi, 1 <= i <= M; for 1 <= i <= M-1 we have Xi+1 > Xi; any two consecutive specified points identify a segment of line in the landscape.
Line M+2: N T
Two integers, separated by a space, the num-ber of light bulbs and their height coordinate (altitude). The bulbs are numbered from 1 to N)
Line M+3: B1 B2 … BN
N integers, separated by spaces: the hori-zon-tal coordinates of the light bulbs Bi+1 > Bi, 1 ?i ?N-1;
Output

File name: LIGHT.OUT
Line 1: K
An integer: the minimum number of light bulbs to be switched on.
Line 2: L1 L2 … LK
K integers, separated by spaces: the labels of the light bulbs to be switched on spe-cified in increasing order of their horizontal coordinates.
Limits

1 <= M <= 200
1 <= N <= 200
1 <= Xi <= 10000 for 1 <= i <= M
1 < T <= 10000
1 <= Hi <= 10000 for 1 <= i <= M
T > Hi for any 1 <= i <= M
X1 <= B1 and BN <=XM
The task always has a solution for the test data. If there are multiple solutions, only one is required.
Sample Input

6
1 1
3 3
4 1
7 1
8 3
11 1
4 5
1 5 6 10
Sample Output

2
1 4
本题没有找到地方提交,所以没有写代码,简述一下思路。
首先根据题意,要照亮整座山,即需要照亮每个折点,如果一个点的左右两点高度都比他高,我们将其定义为一个山谷,进而可以将问题简化为照亮每一个“山谷”(注意:要将起点和终点算是山谷)。
但是我们发现,对于每个灯,其能够照亮的折点并不是连续的,做起来非常复杂,所以我们考虑换个思路,处理每个需要被照的点,将可以找到这个点的灯找出来(可以证明这个一定是连续的),那么接下来问题就转化成为了对于所有找出的区间,找到最少的点使得每个区间内都至少有一个点被覆盖。讲这些区间去除一个包含另一个的情况之后按照起点排序,可以得到一个末位置严格递增的序列,对于每一个没有没覆盖的区间,当然优先选择其最右端的点(贪心),即可的最优答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值