2 条题解

  • 0
    @ 2025-10-8 17:12:08

    /* 令f[i]表示前i个每次都出比对方稍微大一点的牌,最多能赢几次 g[i]表示从i-n中每次出比对方稍微小一点的牌,最多赢几次。 ans=max(f[i]+g[i+1]) */

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int N=5e4+10;
    int a[N],f[N],g[N];
    bool flag[N<<1];
    set<int> s1,s2;
    int main()
    {
        int n;scanf("%d",&n);
        memset(flag,0,sizeof(flag));
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),flag[a[i]]=1;
        for(int i=1;i<=2*n;i++)if(!flag[i])s1.insert(i),s2.insert(-i);
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        {
            auto it=s1.upper_bound(a[i]);
            if(it!=s1.end())f[i]=f[i-1]+1,s1.erase(it);
            else            f[i]=f[i-1];
        }
        memset(g,0,sizeof(g));
        for(int i=n;i>=1;i--)
        {
            auto it=s2.upper_bound(-a[i]);
            if(it!=s2.end())g[i]=g[i+1]+1,s2.erase(it);
            else g[i]=g[i+1];
        }
        int ans=0;for(int i=0;i<=n;i++) ans=max(ans,f[i]+g[i+1]);
        printf("%d",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:12:00
      /*
      令f[i]表示前i个每次都出比对方稍微大一点的牌,最多能赢几次
      g[i]表示从i-n中每次出比对方稍微小一点的牌,最多赢几次。
      ans=max(f[i]+g[i+1]) 
      */
       
      #include <bits/stdc++.h>
      
      using namespace std;
      typedef long long ll;
      const int N=5e4+10;
      int a[N],f[N],g[N];
      bool flag[N<<1];
      set<int> s1,s2;
      int main()
      {
          int n;scanf("%d",&n);
          memset(flag,0,sizeof(flag));
          for(int i=1;i<=n;i++)scanf("%d",&a[i]),flag[a[i]]=1;
          for(int i=1;i<=2*n;i++)if(!flag[i])s1.insert(i),s2.insert(-i);
          memset(f,0,sizeof(f));
          for(int i=1;i<=n;i++)
          {
              auto it=s1.upper_bound(a[i]);
              if(it!=s1.end())f[i]=f[i-1]+1,s1.erase(it);
              else            f[i]=f[i-1];
          }
          memset(g,0,sizeof(g));
          for(int i=n;i>=1;i--)
          {
              auto it=s2.upper_bound(-a[i]);
              if(it!=s2.end())g[i]=g[i+1]+1,s2.erase(it);
              else g[i]=g[i+1];
          }
          int ans=0;for(int i=0;i<=n;i++) ans=max(ans,f[i]+g[i+1]);
          printf("%d",ans);
          return 0;
      }
      • 1

      *【模拟+set】[USACO15DEC] High Card Low Card P

      信息

      ID
      6713
      时间
      1000ms
      内存
      128MiB
      难度
      10
      标签
      递交数
      7
      已通过
      4
      上传者