【问题标题】:Reach destination with minimum energy at start在开始时以最小的能量到达目的地
【发布时间】:2015-04-04 03:31:09
【问题描述】:

给定 N 个点在一条与原点有一定距离的直线上。我们还提供了我们需要到达的终点。现在到第 i 点,我们应该有 X[i] 的能量,并且那个点将给 Y[i] 的利润作为被添加的能量。现在我们需要找出从起点开始到达目的地点的最小能量。

示例: 让我们有 5 个点,目标点距离原点 10 个单位。

那么让我们说第一个点是距离 origin 1 个单位,需要 2 个单位的能量并产生 3 个单位的利润。

第二个点距离原点 2 个单位,需要 3 个单位的能量,利润为 0 个单位。

第三点距离原点 4 个单位,需要 3 个单位的能量并获得 5 个单位的利润。

第四点距离原点 8 个单位,需要 5 个单位的能量,利润为 0 个单位。

第五点距离原点 9 个单位,需要 1 个单位的能量并获得 2 个单位的利润。

现在这个配置的答案是 6。

解释:

因为如果我们从 5 个单位的能量开始,那么

在点 1,我们有超过或等于 2 个单位的能量,因此利润 1 添加到能量中,总能量为 6。

在第 2 点,三个单位的能量将消失,而 3 只剩下 3 个单位。

在第 3 点,由于能量正好是 3,利润将被添加,总能量变为 5。

在第 4 点,所有 5 个单位都将消失,我们无法继续前进

同样,如果我们从 6 开始,其中一个将能够通过点 4 并到达点 4,它会增加一个单位的能量,我们将到达目的地

现在我们要找到开始到达最终目的地所需的最小能量。

【问题讨论】:

  • (1) 回到源头每次迭代消耗 0 能量? (2) 我们可以重游某个目的地吗?
  • @amit 不,你只能通过每个点前进
  • @amit 你不需要回到源头,从你访问的最新点继续
  • 我真的不明白这个问题,所有节点都在一维线上?能源的成本是“进入”一个点,而不是“旅行”它?
  • 如果你从零开始,答案不就是减去你在路径中的小部分吗?

标签: algorithm dynamic-programming


【解决方案1】:

您已将您的问题标记为动态规划。但我认为这更像是一个简单的 O(n) 解决方案的临时问题。从逆向开始解决问题。对于 N=5 点的给定问题:

要到达目的地,第 5 点必须至少有 1 个单位的能量。现在假设你以x能量单位输入第五个点,那么你可以通过等式找到x的最小值:

x - 1 + 2 >= 1
暗示 x>=0
但是 x 的最小值应该是 1 才能到达第 5 个点本身。因此 x = 1。

因此,在进入第 5 点时,您必须至少拥有 1 个单位的能量才能到达最终目的地。同样,我们可以找到进入第四点所需的能量最小值,如下所示:

x - 5 + 0 >= 1
意味着 x >= 6

因此,当您进入第 4 点时,您将需要至少 6 个单位的能量才能到达目的地点。

以这种方式继续,您可以找到进入第一个点时所需的最小能量。这将是必需的答案。

以下working java code 实现了这一点:

        for(int i=0; i<n; i++){
            req[i] = sc.nextInt();
            profit[i] = sc.nextInt();
        }

        int minReq = 1;
        for(int i=n-1; i>=0; i--){
            int minEnter = minReq+req[i]-profit[i];
            minEnter = Math.max(minEnter, req[i]);
            minReq = minEnter;
        }

        System.out.println(minReq);

【讨论】:

  • @greybeard 那么您认为解决方案正确吗?
【解决方案2】:

试试:

         int[] arr = { 1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9 };

         int[] ar = new int[arr.Length];
         int step = 1;
         ar[arr.Length - 1] = -1;

         for (int i = arr.Length - 2; i >= 0; i--)
         {
             if (arr[i] == 0)
                 ar[i] = -1;
             else if (arr[i] >= step)
                 ar[i] = 1;
             else 
             {
                 int min = int.MaxValue;
                 for (int j = 1; j <=arr[i]; j++)
                 {
                     if (ar[i+j]<  min && ar[i+j]>0)
                         min = ar[i+j];
                 }
                 ar[i] =min+ 1;
             }
             step++;
             }
         Console.WriteLine(ar[0]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    相关资源
    最近更新 更多