3 条题解

  • 4
    @ 2023-7-27 15:39:41

    f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]表示走完第i行且停在第i行的右端点的最少步数。 那么转移就很简单了,走完当前行且停到左端点,那么一定是从当前行的右端点过来的。

    从上一行左端点转移到当前行的右端点,最终停留在当前行的左端点的话就是: f[i][0]=f[i-1][0]+abs(上一行左端点的坐标-本行右端点的坐标)+本行线段长度 从上一行右端点转移到当前行的右端点,最终停留在当前行的左端点就是: f[i][0]=f[i-1][1]+abs(上一行右端点的坐标-本行右端点的坐标)+本行线段长度 取二者的最小值

    从上一行左端点转移到当前行的左端点,最终停留在当前行的右端点的话就是: f[i][1]=f[i-1][0]+abs(上一行左端点的坐标-本行左端点的坐标)+本行线段长度 从上一行右端点转移到当前行的左端点,最终停留在当前行的右端点就是: f[i][1]=f[i-1][1]+abs(上一行右端点的坐标-本行左端点的坐标)+本行线段长度 取二者的最小值

    边界f[1][0]=r[1]-1+第一行线段长度, f[1][1]=r[1]-1

    参考代码
    //最初利润为0,若第一天是买入状态,利润为-a[1],若第一天是可买入状态,说明第一题没有买股票,利润为0,第一天不可能为冷冻期。
        f[1][0] = r[1] - 1 + len[1];
        f[1][1] = r[1] - 1 ;
        for (int i = 2; i <= n; i++)
        {
    		f[i][0] = min(f[i - 1][0] + abs(r[i] - l[i-1]), f[i - 1][1] + abs(r[i-1] - r[i])) + len[i] + 1;
    		f[i][1] = min(f[i - 1][0] + abs(l[i-1] - l[i]), f[i - 1][1] + abs(r[i-1] - l[i])) + len[i] + 1;
        }
    
    • @ 2023-11-5 12:07:44

      //最初利润为0,若第一天是买入状态,利润为-a[1],若第一天是可买入状态,说明第一题没有买股票,利润为0,第一天不可能为冷冻期。

    • @ 2023-11-5 12:07:54

      ????

    • @ 2023-12-23 22:03:52

      看不懂QAQ

    • @ 2024-5-11 18:38:25

      看不懂

    • @ 2024-5-18 20:48:35
      //最初利润为0,若第一天是买入状态,利润为-a[1],若第一天是可买入状态,说明第一题没有买股票,利润为0,第一天不可能为冷冻期。
      

      emm... 是不是串题了

  • -4
    @ 2023-8-9 19:37:10
    #include <bits/stdc++.h>
    using namespace std;
    int f[20005][3];
    int abs(int x)
    {
        if(x<0)return -x;
        return x;
    }
    int min(int x,int y)
    {
        if(x<y)return x;
        return y;
    }
    int L[20005],R[20005];
    int main()
    {
        int n;
        cin >> n;
        for(int i=1;i<=n;i++)
        {
            cin >> L[i] >> R[i];
        }
        f[1][0]=L[1]-1+(R[1]-L[1])*2;
        f[1][1]=R[1]-1;
        for(int i=2;i<=n;i++)
        {
            f[i][0]=min(f[i-1][1]+abs(R[i-1]-R[i]),f[i-1][0]+abs(L[i-1]-R[i]))+R[i]-L[i]+1;
            f[i][1]=min(f[i-1][1]+abs(R[i-1]-L[i]),f[i-1][0]+abs(L[i]-L[i-1]))+R[i]-L[i]+1;
        }
        cout << min(f[n][0]+n-L[n],f[n][1]+n-R[n]);
        return 0;
    }
    
  • -6
    @ 2023-7-31 17:52:23
    
    
    #include<cstdio>
    using namespace std;
    int f[20005][3];//设f[i][0]表示走完了第i行且走到左端点;设f[i][1]表示走完了第i行且走到了右端点。
    int abs(int x)
    {
    if(x<0)return -x;
    return x;
    }
    int min(int x,int y)
    {
    if(x<y)return x;
    return y;
    }
    int L[20005],R[20005];
    int main()
    {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
    scanf("%d%d",&L[i],&R[i]);
    }
    f[1][0]=L[1]-1+(R[1]-L[1])*2;
    f[1][1]=R[1]-1;
    for(int i=2;i<=n;i++)
    {
    f[i][0]=min(f[i-1][1]+abs(R[i-1]-R[i]),f[i-1][0]+abs(L[i-1]-R[i]))+R[i]-L[i]+1;
    f[i][1]=min(f[i-1][1]+abs(R[i-1]-L[i]),f[i-1][0]+abs(L[i]-L[i-1]))+R[i]-L[i]+1;
    }
    printf("%d\n",min(f[n][0]+n-L[n],f[n][1]+n-R[n]));
    return 0;
    }
    
    
    
    • @ 2023-8-2 1:59:11

      哥们儿你这个代码格式有点乱吧。看这难受,况且可能管理员会删,因格式错误。👀️

    • @ 2023-8-9 19:29:52

      这代码格式有点小乱呀实在是太6啦

    • @ 2023-8-10 16:43:37

      与csp-j的阅读程序一样,乱的很

    • @ 2023-8-10 16:46:40

      这是用C语言编的吧?又不是,用C++编的吧,第2行没用。为啥要自己编min函数和abs函数?有点不必要。

    • @ 2024-5-11 18:41:58

      @王浩冉 罗子曜最近没来吵你吗

  • 1

信息

ID
351
时间
1000ms
内存
256MiB
难度
1
标签
(无)
递交数
393
已通过
263
上传者