遇到问题:
你有一定数量的士兵。
每个士兵都有一个特定级别(有些是军官,警长等)。现在他们要去杀死一些人。
你的弹药数量有限。根据等级,每个人都会获得一盒弹药。士兵们站在一条直线上。
如果一个较低级别的人在他旁边,那么排名较高的人必须获得更多弹药。
每个人必须至少获得一个盒子。
示例:使用1以上的数字来表示rank: 4 2 3 2 2 1 3 6
。相当于弹药的盒子是:2 1 2 1 2 1 2 3
。
我提出弹药清单的最快方法是采取前三个等级并将它们相互比较(即从示例中,我选择4 2 3
)。接下来我增加一个(即2 3 2
)并再次进行比较。显然,这需要花费很多时间。有更快的方法吗?
注意:排名相同的士兵并不关心每个弹药的数量。
soldier_num = int(input())
i = 0
rating_array = []
ammo_array = []
can_can = soldier_num
while(i < soldier_num):
rating_array.append(int(input()))
ammo_array.append(1)
i += 1
i = 0
while(i < soldier_num):
if(i == 0):
if((rating_array[i] > rating_array[i+1]) and (ammo_array[i] <= ammo_array[i+1])):
ammo_array[i] += 1
i = i-1
can_can += 1
if(0<i<(soldier_num-1)):
if((rating_array[i] > rating_array[i+1]) and (ammo_array[i] <= ammo_array[i+1])):
ammo_array[i] += 1
i = i-1
can_can += 1
elif((rating_array[i] > rating_array[i-1]) and (ammo_array[i] <= ammo_array[i-1])):
ammo_array[i] += 1
i = i-1
can_can += 1
elif((rating_array[i] < rating_array[i-1]) and (ammo_array[i] >= ammo_array[i-1])):
ammo_array[i-1] += 1
i = i-1
can_can += 1
elif((rating_array[i] < rating_array[i+1]) and (ammo_array[i] >= ammo_array[i-1])):
ammo_array[i+1] += 1
i = i-1
can_can += 1
i += 1
if(i == (soldier_num-1)):
if((rating_array[i] > rating_array[i-1]) and (ammo_array[i] <= ammo_array[i-1])):
ammo_array[i] += 1
can_can += 1
print(can_can)
答案 0 :(得分:1)
每个数字有4种可能的类别:
当您在寻找山谷时,将越界索引计为无穷大,在寻找峰值时将0
计算在内。既然你说“同一级别的邻居不关心”,你可以用同样的方式来计算它们。
首先将所有山谷缩小为1
。这应该是直截了当的。
要减少上坡元素,请遍历数组并将其缩小为left+1
。
要减少下坡路线,请向后重复 并将其缩小为right+1
。
最后,峰值降低到较高的邻居,加上一个。
对于你的例子:
4 2 3 2 2 1 3 6 < original
4 1 3 1 2 1 3 6 < valleys reduced
4 1 3 1 2 1 2 3 < uphill reduced
2 1 3 1 2 1 2 3 < downhill reduced
2 1 2 1 2 1 2 3 < peaks reduced
答案 1 :(得分:0)
提示:在这种情况下,您必须定义峰和谷。峰值是&gt; =他们的nieghbours的元素。山谷是元素&lt; =他们的邻居。
将一个方框分配给山谷。
峰和谷应交替。峰值的箱数=距前一个山谷和下一个山谷的距离较大。