列表索引越界(街机游戏)

时间:2020-09-01 14:03:07

标签: python python-3.x list algorithm knapsack-problem

我最近参加了一次采访,有人问我以下问题:

亚当非常擅长玩街机游戏,他将在每场比赛中获胜。当他走在大街上的一天时,他发现了一家拱廊商店,该商店为玩家赢得的每场比赛支付真实现金-但是,该商店每场比赛只支付一次。该商店有一些游戏,他们将为获胜者付费,每个游戏都有其自己的完成时间和支付率。亚当对自己的才能赚钱的前景感到震惊,亚当走进商店后才意识到商店要在2小时内(恰好是120分钟)关闭。知道自己不能在那段时间玩所有的游戏,所以他决定选择能使自己的收入最大化的游戏

街机上的示例游戏板 GAME COMPLETION_TIME (以分钟为单位)PAYOUT_RATE

Pac-man 90  400
Mortal Kombat   10  30
Super Tetris    25  100
Pump it Up  10  40
Street Fighter II   90  450
Speed Racer 10  40

一种可接受的解决方案是即使游戏列表或完成时间或支付率发生变化,仍然可以选择最佳收益的解决方案。

问题: 用Java / Scala / Python编写代码,以帮助Adam选择为他赚钱最多的游戏顺序。

然后,假设您有可变的游戏列表及其支付率。挑选收入最高的游戏的最佳方法是什么?

输入说明: 输入的第一行始终是整数,表示要在第一行之后读取的许多行。在我们的示例测试案例中,第一行有6行,第一行之后有6行,每行都有一个游戏,completion_time和payout_rate。 在每条数据行中,游戏的complete_time和payout_rate用','(逗号)分隔。 游戏板可能会更改,但商店仍会在120分钟内关闭。

输入: 6

Pac-man,80,400
Mortal Kombat,10,30
Super Tetris,25,100
Pump it Up,10,40
Street Fighter II,90,450
Speed Racer,10,40

输出说明: 按字母顺序将获得最多收入的游戏名称打印到标准输出中

输出

Mortal Kombat
Pump it Up
Speed Racer
Street Fighter II

到目前为止已尝试:

import sys
import itertools

line = sys.stdin.readline()
def biggest_payout(line):
   
    a = line.split(sep=' ')
    b = []
    for i in range(1, len(a)):
        b.append(a[i].split(sep=','))
    c = []
    for i in range(len(b)):
        c.append(int(b[i][1]))
    min_sums = []
    for L in range(0, len(c)+1):
        for subset in itertools.permutations(c, L):
            min_sums.append(sum(subset))
    e = []
    for i in range(len(b)):
        e.append(int(b[i][2]))
    money_sums = []
    for L in range(0, len(e)+1):
        for subset in itertools.permutations(e, L):
            money_sums.append(sum(subset))
    k = []
    for i in range(len(b)):
        k.append(b[i][0])
    movie_combos = []
    for L in range(0, len(k)+1):
        for subset in itertools.permutations(k, L):
            movie_combos.append(subset)   
    while True:
        if min_sums[money_sums.index(max(money_sums))] > 120:
            money_sums[money_sums.index(max(money_sums))] = 0
        else:
            index = money_sums.index(max(money_sums))
            break
    return movie_combos[index]

for line in sys.stdin:       
       print(biggest_payout(line))

错误:

  File "/temp/file.py", line 13, in biggest_payout
    c.append(int(b[i][1]))
IndexError: list index out of range

我正在获取数组索引出站,请您指导我如何解决此问题?

1 个答案:

答案 0 :(得分:4)

您不应该按' '分隔行,并且代码还有更多问题。

排列也将包含(Pac-man, Mortal Kombat) (Mortal Kombat, Pac-man)等。我宁愿使用组合(在这种情况下,组合比排列少10倍)并编写类似这个。

import sys
import itertools

n = int(sys.stdin.readline())

games = {}
for i in range(n):
    s = sys.stdin.readline().rstrip().split(',')
    games[s[0]] =  (int(s[1]), int(s[2]))

res = ()
maxpay = 0

for k in range(1, n):
    for z in itertools.combinations(games, k):
        time = 0
        pay = 0
        for x in z:
            time += games[x][0]
            if time > 120:
                break
            pay +=  games[x][1]
        if time <= 120 and pay > maxpay:
            res = z
            maxpay = pay

print('\n'.join(sorted(list(res))))

测试。

$cat data 
6
Pac-man,80,400
Mortal Kombat,10,30
Super Tetris,25,100
Pump it Up,10,40
Street Fighter II,90,450
Speed Racer,10,40

$python3 solution.py < data
Mortal Kombat
Pump it Up
Speed Racer
Street Fighter II