给每个士兵一些弹药:)

时间:2013-10-31 15:18:44

标签: python algorithm

遇到问题:

你有一定数量的士兵。

每个士兵都有一个特定级别(有些是军官,警长等)。现在他们要去杀死一些人。

你的弹药数量有限。根据等级,每个人都会获得一盒弹药。士兵们站在一条直线上。

如果一个较低级别的人在他旁边,那么排名较高的人必须获得更多弹药。

每个人必须至少获得一个盒子。

示例:使用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)

2 个答案:

答案 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; =他们的邻居。

将一个方框分配给山谷。

峰和谷应交替。峰值的箱数=距前一个山谷和下一个山谷的距离较大。