zoukankan      html  css  js  c++  java
  • Ural2110 : Remove or Maximize

    设最大的数为$w$,若$n>k+log w$,那么显然所有$1$都可以保留,否则现在$nleq k+log w$。

    如果$wleq 100000$,那么可以DP,设$f[i][j]$表示考虑前$i$个数,保留的数的$or$是$j$时,最多能删除多少个数,时间复杂度$O(nw)$。

    如果$w>100000$,那么$kleq 7$,爆搜即可,时间复杂度$O(C(n,k))$。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=100010;
    int n,m,i,j,o,ans,mx,f[2][131100],a[N];
    void dfs(int x,int y,int z){
      if(y+n-x+1<m)return;
      if(x>n){
        ans=max(ans,z);
        return;
      }
      dfs(x+1,y,z|a[x]);
      if(y<m)dfs(x+1,y+1,z);
    }
    int main(){
      scanf("%d%d",&n,&m);
      for(i=1;i<=n;i++)scanf("%d",&a[i]),mx=max(mx,a[i]);
      if(n>m+31){
        for(i=1;i<=n;i++)ans|=a[i];
        return printf("%d",ans),0;
      }
      if(mx<=100000){
        for(i=0;i<131072;i++)f[0][i]=-N;
        f[0][0]=0;
        for(i=o=1;i<=n;i++,o^=1){
          for(j=0;j<131072;j++)f[o][j]=f[o^1][j]+1;
          for(j=0;j<131072;j++)if(f[o^1][j]>=0)f[o][j|a[i]]=max(f[o][j|a[i]],f[o^1][j]);
        }
        for(i=131071;~i;i--)if(f[o^1][i]>=m)break;
        return printf("%d",i),0;
      }
      dfs(1,0,0);
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    并发控制-CycliBarrier
    并发控制-条件对象(Condition接口)
    并发控制-信号量(Semaphore)
    控制并发-CountDownLatch
    控制并发流程
    [杂谈]重新认识RDD
    【杂谈】RDD-运行-2
    【杂谈】RDD-依赖
    [杂谈]Executor-1
    [杂谈]Rdd运行-1
  • 原文地址:https://www.cnblogs.com/clrs97/p/6422187.html
Copyright © 2011-2022 走看看