Smart喜欢玩骨牌。一天,他沿着一条直线放了 n 颗骨牌,从左往右坐标依次为x1,x2,xn, 每颗骨牌都有它的高度,第i个骨牌的高度为hi Smart 可以放倒一颗骨牌,然后把它倒向左边,那它就占据了区间[xi-hi,xi]; 或者把它倒向右边, 那它就占据了区间[xi,xi+hi] ,没有被放倒的骨牌只占据一个坐标为xi的点。 现在的问题是他最多能放倒多少个骨牌,使得任意两个骨牌,彼此之间占据的部分都没有公共部分。
时间: 2023-05-30 09:03:41 浏览: 82
多米诺骨牌游戏-艾默生ups电源nx系列(30-200kva)
可以使用贪心的思想来解决这个问题。首先将所有骨牌按照右端点坐标从小到大排序。然后从左往右遍历每一个骨牌,对于每一个骨牌,如果它的左端点和右端点都没有被其他骨牌占据,那么它就可以被放倒。否则,就不放倒这个骨牌。
具体实现时,可以用一个数组记录每个坐标上的骨牌数量,初始值都为1,表示该位置上有一个未被放倒的骨牌。然后按照右端点从小到大排序,对于每一个骨牌,从它的左端点到右端点遍历一遍,将这些位置上的骨牌数量减一,表示它们已经被占据了。如果在遍历过程中发现某个位置上的骨牌数量已经为0了,说明这个位置上已经有其他骨牌占据了,那么就不放倒当前的骨牌。如果遍历完整个区间都没有发现任何位置上的骨牌数量为0,那么就放倒当前的骨牌,并将它占据的位置上的骨牌数量设为2,表示这个位置上已经有两个骨牌占据了。
最后统计一下被放倒的骨牌数量即可。时间复杂度为O(nlogn),因为需要对所有骨牌按照右端点排序。
阅读全文