[USACO][1.3.2]Barn Repair
Barn RepairIt was a dark and stormy night that ripped the roof and gates off thestalls that hold Farmer John's cows. Happily, many of the cows were onvacation, so the barn was not completely full.
The cows spend the night in stalls that are arranged adjacent to eachother in a long line. Some stalls have cows in them; some do not. Allstalls are the same width.
Farmer John must quickly erect new boards in front of the stalls, sincethe doors were lost. His new lumber supplier will supply him boards ofany length he wishes, but the supplier can only deliver a small numberof total boards. Farmer John wishes to minimize the total length of theboards he must purchase.
Given M (1 <= M <= 50), the maximum number of boards that can bepurchased; S (1 <= S <= 200), the total number of stalls; C (1<= C <= S) the number of cows in the stalls, and the C occupiedstall numbers (1 <= stall_number <= S), calculate the minimumnumber of stalls that must be blocked in order to block all the stallsthat have cows in them.
Print your answer as the total number of stalls blocked.
PROGRAM NAME: barn1
INPUT FORMAT
Line 1: M, S, and C (space separated)
Lines 2-C+1: Each line contains one integer, the number of an occupied stall.
SAMPLE INPUT (file barn1.in)
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43
OUTPUT FORMAT
A single line with one integer that represents the total number of stalls blocked.
SAMPLE OUTPUT (file barn1.out)
25
[One minimum arrangement is one board covering stalls 3-8, one covering 14-21, one covering 25-31, and one covering 40-43.] 修理牛棚
译 by tim green
在一个暴风雨的夜晚,农民约翰的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚没有住满。剩下的牛一个紧挨着另一个被排成一行来过夜。 有些牛棚里有牛,有些没有。 所有的牛棚有相同的宽度。自门遗失以后,农民约翰很快在牛棚之前竖立起新的木板。 他的新木材供应者将会供应他任何他想要的长度,但是供应者只能提供有限数目的木板。农民约翰想将他购买的木板总长度减到最少。 给出 M(1<= M<=50),可能买到的木板最大的数目;S(1<= S<=200),牛棚的总数;C(1 <= C <=S) 牛棚里牛的数目,和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。 输出所需木板的最小总长度作为的答案。
PROGRAM NAME: barn1
INPUT FORMAT
第 1 行: M , S 和 C(用空格分开)
第 2 到 C+1行: 每行包含一个整数,表示牛所占的牛棚的编号。
SAMPLE INPUT (file barn1.in)
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43
OUTPUT FORMAT
单独的一行包含一个整数表示所需木板的最小总长度。
SAMPLE OUTPUT (file barn1.out)
25
[ 一种最优的安排是用板拦住牛棚3-8,14-21,25-31,40-43.] 思路一
要使木板总长度最少,就要使未盖木板的长度最大。
我们先用一块木板盖住牛棚,然后,每次从盖住的范围内选一个最大的空隙,以空隙为界将木板分成两块,重复直到分成m块或没有空隙。
可以用二叉堆来优化算法。
贪心的证明略。
思路二
相比于思路一更容易理解。显然,当所有木板均用上时,长度最短(证明....)。正向思维,初始状态有c块木板,每块木板只盖住一个牛棚。
由c块倒推至m块木板,每次寻找这样的两个牛棚:其间距在所有未连接的木板中最小。当这两个牛棚的木板连接时,总木板数减一,总长度增加。
页:
[1]