simonliu30 2023-07-27 18:50 采纳率: 100%
浏览 12
已结题

李大志的白日梦c++

Background
Special for beginners, ^_^

Description
李大志做了一个白日梦。

一共有n个城市,编号为1,2,3,…n。城市 i和城市i+1有一条双向高速公路连接,走这条路要耗费时间a i。
他现在要去旅游,起点 1号城市,终点是n城市,i号城市只能到达 i+1和i−1号城市。
不仅如此,他还有一个传送器,传送距离为k,也就是可以从i城市传送到i−k或i+k号城市。如果传送的城市编号小于1则为1,大于n则为n。
但是他的传送器电量不足,只能传送一次,同时由于他出门的时候忘记关门了,他想尽快的结束,于是就想问你结束最快的时间是多少。
注意:他不必访问所有的城市,使用传送器不耗费时间
Format
Input
两行,第一行两个正整数
n,k(1≤n≤1000000,0≤k<n)。
第二行n−1个整数,第i个表示
(a i≤10000000)。
Output
一个整数,表示答案。

Samples
輸入資料 1
4 0
1 2 3
輸出資料 1
6
輸入資料 2
4 1
1 2 3
輸出資料 2
3
Limitation
1s, 1024KiB for each test case.
能给我一下思路吗?(c++)

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-27 20:38
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/660353
    • 以下回答由chatgpt基于相关博客总结生成:

      这个问题可以用动态规划来解决。我会给出具体的解决方案并展示代码。

      首先,我们可以定义一个动态规划数组dp,dp[i]表示到达第i个城市所需的最快时间。

      然后,我们可以初始化dp数组。起点是1号城市,所以dp[1]为0。其它城市的最快时间初始化为一个很大的数,比如INT_MAX。

      接下来,我们可以使用一个循环来遍历所有的城市,计算dp数组的值。在计算dp[i]时,我们需要考虑以下几种情况:

      1. 如果城市i和i+1之间有一条路,那么到达城市i+1的最快时间就是到达城市i的最快时间加上走这条路的耗时。即dp[i+1] = dp[i] + a[i]。

      2. 如果城市i和i-1之间有一条路,那么到达城市i-1的最快时间就是到达城市i的最快时间加上走这条路的耗时。即dp[i-1] = dp[i] + a[i-1]。

      3. 如果传送器可以用,且传送的城市编号在有效范围内,那么到达传送城市的最快时间就是到达城市i的最快时间。

        • 如果传送的城市编号小于1,则为1。
        • 如果传送的城市编号大于n,则为n。

      最后,dp[n]就是最快结束旅行所需的时间。

      以下是具体的代码实现:

      #include <iostream>
      #include <vector>
      #include <climits>
      
      using namespace std;
      
      int main() {
          int n, k;
          cin >> n >> k;
      
          vector<int> a(n-1);
          for (int i = 0; i < n-1; i++) {
              cin >> a[i];
          }
      
          vector<int> dp(n+1, INT_MAX); // 初始化dp数组,初始值为INT_MAX
          dp[1] = 0; // 起点城市的最快时间为0
      
          for (int i = 1; i <= n; i++) {
              if (i+1 <= n) {
                  dp[i+1] = min(dp[i+1], dp[i] + a[i-1]); // 到达城市i+1的最快时间
              }
              if (i-1 >= 1) {
                  dp[i-1] = min(dp[i-1], dp[i] + a[i-2]); // 到达城市i-1的最快时间
              }
              if (k > 0) {
                  int teleport = i + k; // 传送的城市编号
                  teleport = min(teleport, n); // 如果传送的城市编号大于n,则为n
                  dp[teleport] = min(dp[teleport], dp[i]); // 到达传送城市的最快时间
              }
          }
      
          cout << dp[n] << endl; // 输出最快结束旅行所需的时间
      
          return 0;
      }
      

      你可以将上述代码复制到IDE中进行编译和运行,然后输入每组测试数据的n,k和每条公路的耗时,即可得到最快结束旅行所需的时间。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月27日

悬赏问题

  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?