字节跳动2019笔试题
问题描述
圆桌n个人,每一个人有一个得分,相邻两人中得分高的人得到的奖品比得分低 的人多。每个人至少获得一个奖品,问一桌人至少需要准备多少奖品。
输入: 人数n,圆桌上每个人的得分s (n维数组)
输出: 最少需要的奖品数m
解法
因为是圆桌,得分数组s应该看作循环列表。找出其中的局部极小点,即得分比左右两人都低的人,由循环列表的特性可知这样的人至少存在一个。我们给极小点一个奖品,然后给极小点两边比极小点大的人2个奖品,在给2个奖品旁边得分更高的人3个奖品,以此类推直到所有人都分到奖品;如果有人从不同的极小点开始计算得到奖品数不同,则取奖品数最多的计算方式。
举例
8个人得分1,3,5,7,2,4,6,8,此时极小点有两个(1和2),首先给得分为1和2的两人1个奖品;3在1的旁边,因此获得2个奖品,同理5获得3个奖品,得分为7的人按左边1-3-5-7的顺序应该获得4个奖品,按右边2-7的顺序应该获得2个奖品,取奖品多的一边,即4个。同理,4,6,8分别获得2,3,4个奖品,总共1+2+3+4+1+2+3+4=20个奖品。