2 条题解

  • 0
    @ 2025-10-8 16:58:17
    import heapq
    
    def main():
        import sys
        input = sys.stdin.read
        data = input().split()
        idx = 0
        N = int(data[idx])
        idx += 1
        M = int(data[idx])
        idx += 1
        m = list(map(int, data[idx:idx+M]))
        idx += M
        m = [0] + m  # 1-based indexing for m[1..M]
        
        INF = float('inf')
        # d[u][i] is the minimal cost to reach node u with last operation i
        d = [[INF] * (M + int(1)) for _ in range(N + int(1))]  # u:1..N, i:1..M
        
        heap = []
        # Initialize: start at node 1, using any operation i (cost 0)
        for i in range(1, M + 1):
            d[1][i] = 0
            heapq.heappush(heap, (0, 1, i))
        
        while heap:
            dist, u, i = heapq.heappop(heap)
            if u == N:
                print(dist)
                return
            if dist > d[u][i]:
                continue
            # Try all operations j
            for j in range(1, M + 1):
                mj = m[j]
                v1 = u + mj
                v2 = u - mj
                vs = []
                if 1 <= v1 <= N:
                    vs.append(v1)
                if 1 <= v2 <= N:
                    vs.append(v2)
                # Avoid duplicate v1 and v2
                vs = list(set(vs))
                for v in vs:
                    new_cost = dist + abs(2 * mj) + abs(j - i)
                    if new_cost < d[v][j]:
                        d[v][j] = new_cost
    • 0
      @ 2025-10-8 16:57:13



      省流题面:一张无向图中有 $N$ 个点,给定 $M$ 个操作(以下用 $m_1,m_2,...,m_n$ 表示), 如果来到当前节点使用的操作为 $m_i$ ,下一步可以花费 $ \left| 2 \times m_j \right| + \left| j-i \right| $ 的代价移动 $ m_j $ 个单位,也可以花费 $ \left| 2 \times m_i \right| $ 的代价移动 $ m_i $ 个单位,求从 $ 1 $ 号点到 $ N $ 号点的最少代价。

      • 1

      信息

      ID
      1473
      时间
      1000ms
      内存
      64MiB
      难度
      8
      标签
      递交数
      115
      已通过
      18
      上传者