4 条题解

  • 5
    @ 2024-5-8 19:44:46

    萌新不会写题解的话,可以复制我的代码。 已AC。 也可以抄核桃编程里的‘最长上升子序列’,不过有几个地方得改一下,我已经做了标记。(注意,我的代码没错,是核桃里的代码得改)

    #include<bits/stdc++.h>
    using namespace std;
    int n, a[200005], f[200005], g[200005];
    int ans;
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        for(int i = 1;i <= n;i++){
            if (a[i - 1] < a[i])
                f[i] = f[i - 1] + 1;
            else f[i] = 1;
        }
        for (int i = n; i >= 1; i--)
        {
            if(a[i+1]-1 > a[i]){ //这边得改
                g[i] = g[i+1]+1;        
            }
            else g[i] = 1;
        }
        for (int i = 1; i <= n; i++)
        {
            if(a[i-1] < a[i+1]-1){//这边得改
                ans = max(ans,f[i-1]+g[i+1]+1);//这边得改
            }
            ans = max(ans,max(f[i]+1,g[i]+1));//这边得改
        }
        cout << ans;
        return 0;
    }
    

    一个赞抱走~

    • 2
      @ 2024-6-4 21:15:03

      加加加减减减减加强版: @hetao24883491

      #include <bits/stdc++.h>                                                                                                                                                                                     oaaaaaaaaalllllllllllllllllllllllll!!!
      
      using namespace std;
      int main(void)
      {
          register int n,*a,*f,*g,ans=0;
          cin>>n;                                                                                                                                                                         菜!
          a=new int[n+2];
          for(register int i=1;i<=n;i++)
              cin>>a[i];                                                                                                                                                                     
          f=new int[n+2];
          memset(f,0,(n+2)*sizeof(int));
          g=new int[n+2];                                                                                                                                                                   就多练!~
          memset(g,0,(n+2)*sizeof(int));
          for(register int i=1;i<=n;i++)
              if(a[i-1]<a[i])
                  f[i]=f[i-1]+1;
              else
                  f[i]=1;                                                                                                                                                               输不起
          for(register int i=n;i>=1;i--)
              if(a[i]<a[i+1])
                  g[i]=  g[i+1]+1;
              else
                  g[i] = 1;
          for(register int i = 1;i <= n;i++)
              if(a[i-1]<a[i+1]-1)
                  ans = max(ans,f[i-1]+g[i+1]+1);                                                                                                                                       就别玩!~
              else
                  ans = max(ans,max(f[i-1]+1,g[i+1]+1));
          cout << ans;
          return 0;
      }                                                                                                                                                                                       ```cppppcpc```coaaaaaaaalllllllllllllllllllooooooooooooooooooooooaloaloaaol
      

      备注:右翻有东西南北>_>

      • 1
        @ 2023-11-27 19:12:24

        这道题目有点难。不过理解了就可以了。

        1. 先定义f和g数组,分别存储从前往后和从后往前每个位置的最长上升子序列长度。

        2. 寻找规律,第i个有两种可能:

          (1) 如果a[i-1]比a[i+1]小至少2,说明可以在里面参杂中间数,就是f[i-1]+g[i+1]+1

          (2) 否则就是比对改成一个数从前往后看好还是从后往前看好,就是max(f[i-1]+1,g[i+1]+1

        所以核心代码就是:

        for(register int i=1;i<=n;i++)                                                                                                                                                                                         \\防抄袭
            if(a[i-1]<a[i+1]-1)                                                                                                                                                                                         \\防抄袭
                ans=max(ans,f[i-1]+g[i+1]+1);                                                                                                                                                                                         \\防抄袭
            else                                                                                                                                                                                         \\防抄袭
                ans=max(ans,max(f[i-1]+1,g[i+1]+1));                                                                                                                                                                                         \\防抄袭
        

        参考代码:

        #include <iostream>
        #include <cstring>
        using namespace std;
        int main(void){                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            register int n,*a,*f,*g,ans=0;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            cin>>n;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            a=new int[n+2];                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            for(register int i=1;i<=n;i++)
                cin>>a[i];                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            f=new int[n+2];                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            memset(f,0,(n+2)*sizeof(int));                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            g=new int[n+2];                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            memset(g,0,(n+2)*sizeof(int));                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            for(register int i=1;i<=n;i++)
                if(a[i-1]<a[i])
                    f[i]=f[i-1]+1;
                else
                    f[i]=1;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            for(register int i=n;i>=1;i--)
                if(a[i]<a[i+1])
                    g[i]=g[i+1]+1;
                else
                    g[i]=1;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            for(register int i=1;i<=n;i++)
                if(a[i-1]<a[i+1]-1)
                    ans=max(ans,f[i-1]+g[i+1]+1);
                else
                    ans=max(ans,max(f[i-1]+1,g[i+1]+1));                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            cout<<ans;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            delete a;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            delete f;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            delete g;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
            return 0;                                                                                                                                                                                        cout<<"防抄袭"<<endl;
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   //防作弊
        

        注意:不要复制代码,不然,你可能会……

        • @ 2024-1-28 18:57:49

          闃叉妱琚 闃叉妱琚 5 闃叉妱琚 闃叉妱琚 3 5 2 7 9 闃叉妱琚 闃叉妱琚 闃叉妱琚 闃叉妱琚 闃叉妱琚 闃叉妱琚 闃叉妱琚 闃叉妱琚 5闃叉妱琚 闃叉妱琚 闃叉妱琚 闃叉妱琚

        • @ 2024-1-28 19:00:19

          解决方法:往右划,把 cout<<"防抄袭"<<endl;删了

        • @ 2024-2-24 17:56:51

          我被坑了,直到看见你这条评论,真是好人@

        • @ 2024-4-6 8:10:35
          #include <iostream>
          #include <cstring>
          using namespace std;
          int main(void){
              register int n,*a,*f,*g,ans=0;
              cin>>n;
              a=new int[n+2];
              for(register int i=1;i<=n;i++)
                  cin>>a[i];
              f=new int[n+2];
              memset(f,0,(n+2)*sizeof(int));
              g=new int[n+2];
              memset(g,0,(n+2)*sizeof(int));
              for(register int i=1;i<=n;i++)
                  if(a[i-1]<a[i])
                      f[i]=f[i-1]+1;
                  else
                      f[i]=1;
              for(register int i=n;i>=1;i--)
                  if(a[i]<a[i+1])
                      g[i]=g[i+1]+1;
                  else
                      g[i]=1;
              for(register int i=1;i<=n;i++)
                  if(a[i-1]<a[i+1]-1)
                      ans=max(ans,f[i-1]+g[i+1]+1);
                  else
                      ans=max(ans,max(f[i-1]+1,g[i+1]+1));
              cout << ans;
              return 0;
          }
          //删过了,可以直接复制,看我人多好
          
        • @ 2024-4-6 19:33:56

          @ 加强版 AC 代码

          #include <iostream>
          #include <iomanip>
          #include <stdio.h>
          #include <bits/stdc++.h>
          #include <algorithm>
          #include <cmath>
          #include <string>
          #include <cstring>
          using namespace std;
          int main(void)
          {
              register int n,*a,*f,*g,ans=0;
              cin>>n;
              a=new int[n+2];
              for(register int i=1;i<=n;i++)
                  cin>>a[i];
              f=new int[n+2];
              memset(f,0,(n+2)*sizeof(int));
              g=new int[n+2];
              memset(g,0,(n+2)*sizeof(int));
              for(register int i=1;i<=n;i++)
                  if(a[i-1]<a[i])
                      f[i]=f[i-1]+1;
                  else
                      f[i]=1;
              for(register int i=n;i>=1;i--)
                  if(a[i]<a[i+1])
                      g[i]=g[i+1]+1;
                  else
                      g[i]=1;
              for(register int i=1;i<=n;i++)
                  if(a[i-1]<a[i+1]-1)
                      ans=max(ans,f[i-1]+g[i+1]+1);
                  else
                      ans=max(ans,max(f[i-1]+1,g[i+1]+1));
              cout << ans;
              return 0;
          }
          
        • @ 2024-4-6 19:34:35

          作者果然有一个有趣的灵魂,连出题解都这么有趣~

        • @ 2024-4-6 19:35:50

          @ 坑要多大有多大 没事看我的 加强版 AC无误导版

          #include <iostream>
          #include <iomanip>
          #include <stdio.h>
          #include <bits/stdc++.h>
          #include <algorithm>
          #include <cmath>
          #include <string>
          #include <cstring>
          using namespace std;
          int main(void)
          {
              register int n,*a,*f,*g,ans=0;
              cin>>n;
              a=new int[n+2];
              for(register int i=1;i<=n;i++)
                  cin>>a[i];
              f=new int[n+2];
              memset(f,0,(n+2)*sizeof(int));
              g=new int[n+2];
              memset(g,0,(n+2)*sizeof(int));
              for(register int i=1;i<=n;i++)
                  if(a[i-1]<a[i])
                      f[i]=f[i-1]+1;
                  else
                      f[i]=1;
              for(register int i=n;i>=1;i--)
                  if(a[i]<a[i+1])
                      g[i]=g[i+1]+1;
                  else
                      g[i]=1;
              for(register int i=1;i<=n;i++)
                  if(a[i-1]<a[i+1]-1)
                      ans=max(ans,f[i-1]+g[i+1]+1);
                  else
                      ans=max(ans,max(f[i-1]+1,g[i+1]+1));
              cout << ans;
              return 0;
          }
          
      • -1
        @ 2024-4-6 19:36:50
        #include <iostream>
        #include <iomanip>
        #include <stdio.h>
        #include <bits/stdc++.h>
        #include <algorithm>
        #include <cmath>
        #include <string>
        #include <cstring>
        using namespace std;
        int main(void)
        {
            register int n,*a,*f,*g,ans=0;
            cin>>n;
            a=new int[n+2];
            for(register int i=1;i<=n;i++)
                cin>>a[i];
            f=new int[n+2];
            memset(f,0,(n+2)*sizeof(int));
            g=new int[n+2];
            memset(g,0,(n+2)*sizeof(int));
            for(register int i=1;i<=n;i++)
                if(a[i-1]<a[i])
                    f[i]=f[i-1]+1;
                else
                    f[i]=1;
            for(register int i=n;i>=1;i--)
                if(a[i]<a[i+1])
                    g[i]=g[i+1]+1;
                else
                    g[i]=1;
            for(register int i=1;i<=n;i++)
                if(a[i-1]<a[i+1]-1)
                    ans=max(ans,f[i-1]+g[i+1]+1);
                else
                    ans=max(ans,max(f[i-1]+1,g[i+1]+1));
            cout << ans;
            return 0;
        }
        
        • 1

        信息

        ID
        501
        时间
        1000ms
        内存
        256MiB
        难度
        4
        标签
        (无)
        递交数
        355
        已通过
        160
        上传者