1 条题解

  • 0
    @ 2025-8-24 21:48:57

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Lemon
    **

    搬运于2025-08-24 21:48:57,当前版本为作者最后更新于2017-07-21 16:11:10,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    本题其实并不难

    首先我们可以建一个数组cl,保存此位置之前最窄的管子大小。

    再从最底下扫一遍,依次看看盘子会卡在哪里;

    最后如果最后一个没进去就到顶部,则输出0;

    否则输出最后一个卡在哪里。

    请注意这里管子的宽度是从上到下输入的,所以上方的先输入。

    #include<bits/stdc++.h>
    using namespace std;
    int cl[300001],now,n,m,pan[300001],guan[300001];
    int main()
    {
        int i,step;
        cin>>n>>m;
        step=n;
        for(i=1;i<=n;i++)
          scanf("%d",&guan[i]);
        for(i=1;i<=m;i++)
          scanf("%d",&pan[i]);
        cl[1]=guan[1];
        for(i=2;i<=n;i++)
          if(cl[i-1]<guan[i]) cl[i]=cl[i-1];
             else cl[i]=guan[i];//记录i之前最窄的位置的宽度。
        for(i=1;i<=m;i++)
         { 
          while(cl[step]<pan[i]) step--; //如果放不下,则向上走。
          step--;
          if(step==0) {
                            cout<<'0';
                            return 0;//如果step超出了最高的管子,直接输出0,结束程序。
                      }
         }
         cout<<step+1;//否则输出最后的位置。
         return 0; 
    }
    
    • 1

    信息

    ID
    2511
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者