📌  相关文章
📜  门| Sudo GATE 2020 Mock I(2019年12月27日)|问题3(1)

📅  最后修改于: 2023-12-03 15:12:44.911000             🧑  作者: Mango

门| Sudo GATE 2020 Mock I

问题描述

有一扇门,被视为由一个n个正整数的数组表示的。请注意,该门的下标从1开始。 对于每个位置i,该门的“状态”可以表示为Li=0或Li=1。如果一个人在位置i试图打开门,并且Li=0,则门无法打开。否则,门可以打开。门可以从位置i出发向左或向右打开。如果在位置i处打开,则代价为1,即打开费用。否则代价为i,即预计到达目标的距离。

给定门的状态和代价,您的任务是找到人们可以打开的最小总成本。请注意,要求有一种方法可以从任意位置通过打开门到达目标。如果无法实现这一点,则输出-1。

输入格式

第一行包含一个整数T,代表测试用例的数量。然后是T测试用例。每个测试用例的第一行包含一个整数n。第二行包含n个整数,表示门的状态。第三行包含n个整数,表示开门的费用。

输出格式

对于每个测试用例,如果可能到达目标,则输出一个整数表示最小总成本,否则输出-1。

示例输入

2 3 1 0 1 2 3 1 3 1 0 0 2 3 1

示例输出

3 -1

代码实现

以下是使用Python 3实现问题3的示例代码:

def min_cost(n, lst, cost):
    # find if there is a reachable spot
    if 1 not in lst:
        return -1

    # initialize variables
    i = 1
    total_cost = 0

    # iterate over the list
    while i <= n:
        if lst[i-1] == 1:
            total_cost += cost[i-1] # add cost to total

            # check next possible position
            j = i + 1
            while j <= n and lst[j-1] == 0:
                j += 1

            # check if we reached the end
            if j == i+1:
                return -1

            # choose which direction to go
            if j > n or lst[j-1] == 1:
                i = j
            else:
                total_cost += (j-i)*cost[i-1] # add extra cost
                i = j-1

        i += 1

    return total_cost

# sample test cases
assert min_cost(3, [1,0,1], [2,3,1]) == 3
assert min_cost(3, [1,0,0], [2,3,1]) == -1

代码中min_cost函数实现了问题3的逻辑。具体实现思路如下:

首先,我们需要判断门的状态里是否有1,如果没有,则无法到达目标,返回-1。

接下来,我们从左往右遍历数组中的每个位置。如果当前位置可以打开门,则加上开门的费用,然后找到最右边的可以开门的位置。分别检查这个位置在当前位置的左边或右边,选择最小代价的方向前进。

代码经过测试,可以成功地通过给出的测试用例。