• P2032 「Poetize9」升降梯上


    描述

    开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。
    Nescafe之塔一共有N层,升降梯在每层都有一个停靠点。手柄有M个控制槽,第i个控制槽旁边标着一个数Ci,满足C1<C2<C3<……<CM。如果Ci>0,表示手柄扳动到该槽时,电梯将上升Ci层;如果Ci<0,表示手柄扳动到该槽时,电梯将下降-Ci层;并且一定存在一个Ci=0,手柄最初就位于此槽中。注意升降梯只能在1~N层间移动,因此扳动到使升降梯移动到1层以下、N层以上的控制槽是不允许的。
    电梯每移动一层,需要花费2秒钟时间,而手柄从一个控制槽扳到相邻的槽,需要花费1秒钟时间。探险队员现在在1层,并且想尽快到达N层,他们想知道从1层到N层至少需要多长时间?
    题解:
    据说正解是分层SPFA?好像也可行。
    我直接一个无脑DP,无限循环,也能过
    之所以要无限循环是因为DP没有显性的先后关系,只好乱来了。。。
    代码:
     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<iostream>
     7 #include<vector>
     8 #include<map>
     9 #include<set>
    10 #include<queue>
    11 #include<string>
    12 #define inf 1000000000
    13 #define maxn 2000
    14 #define maxm 100
    15 #define eps 1e-10
    16 #define ll long long
    17 #define pa pair<int,int>
    18 #define for0(i,n) for(int i=0;i<=(n);i++)
    19 #define for1(i,n) for(int i=1;i<=(n);i++)
    20 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    21 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    22 #define mod 1000000007
    23 using namespace std;
    24 inline int read()
    25 {
    26     int x=0,f=1;char ch=getchar();
    27     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    28     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    29     return x*f;
    30 }
    31 int n,m,p,a[maxn],f[maxn][maxm];
    32 int main()
    33 {
    34     freopen("input.txt","r",stdin);
    35     freopen("output.txt","w",stdout);
    36     n=read();m=read();
    37     for1(i,m)a[i]=read();
    38     for1(i,n)for1(j,m)f[i][j]=inf;
    39     for1(i,m)if(!a[i])p=i;
    40     for1(i,m)f[1][i]=abs(i-p);
    41     bool flag=1;
    42     while(flag)
    43     {
    44         flag=0;
    45         for3(i,n,1) 
    46          for1(j,m)
    47           {
    48               int k=i-a[j];
    49              if(k>n||k<1)continue;
    50              for1(l,m)
    51               if(f[k][l]+abs(l-j)+abs(a[j])*2<f[i][j])flag=1,f[i][j]=f[k][l]+abs(l-j)+abs(a[j])*2;
    52           }
    53         //for1(i,n)for1(j,m)cout<<i<<' '<<j<<' '<<f[i][j]<<endl;
    54     }
    55     int ans=inf;
    56     for1(i,m)ans=min(ans,f[n][i]);
    57     printf("%d
    ",ans>=inf/2?-1:ans);
    58     return 0;
    59 }
    View Code
  • 相关阅读:
    深入理解javascript原型和闭包(10)——this
    深入理解javascript原型和闭包(9)——简述【执行上下文】下
    深入理解javascript原型和闭包(8)——简述【执行上下文】上
    深入理解javascript原型和闭包(7)——原型的灵活性
    golang 处理 json 结构体
    git push 时用户的配置
    vscod如何自定义 python虚拟环境
    Python实现图片的base64编码
    解决vscode中golang插件依赖安装失败问题
    (转)vscode实现markdown流程图
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4051257.html
Copyright © 2020-2023  润新知