zoukankan      html  css  js  c++  java
  • CF1185F Two Pizzas 状压

    你发现 pizza 种类数不会很多,状压一下就可以了

    code: 

    #include <bits/stdc++.h>  
    #define M 11   
    #define N 100005    
    #define LL long long 
    using namespace std;   
    int n,m,cnt;  
    int v[1<<M],tmp[M],id[1<<M],a1[1<<M],a2[1<<M];   
    LL val[1<<M];   
    LL mer[1<<M]; 
    int tot[1<<M];              
    struct node 
    {    
        LL x; 
        int id; 
        node(LL x=0,int id=0):x(x),id(id){}  
    };   
    vector<node>gg[1<<M];  
    bool cmp(node a,node b) 
    {
        return a.x<b.x;   
    }
    int main() 
    {   
        int i,j;   
        scanf("%d%d",&n,&m);    
        for(i=0;i<=10;++i)   tmp[i]=1<<i;    
        for(i=1;i<=n;++i) 
        {        
            int t,x,re=0; 
            scanf("%d",&t); 
            for(j=1;j<=t;++j)    scanf("%d",&x),re|=tmp[x];   
            ++v[re];           
        }
        for(i=1;i<=m;++i) 
        {   
            LL x; 
            scanf("%lld",&x); 
            int t,o,re=0; 
            scanf("%d",&t); 
            for(j=1;j<=t;++j)   scanf("%d",&o),re|=tmp[o];                       
            if(!val[re]||val[re]>x)   val[re]=x, id[re]=i;     
            gg[re].push_back(node(x,i));    
        }             
        for(i=1;i<tmp[10];++i)   sort(gg[i].begin(),gg[i].end(),cmp); 
        for(i=1;i<tmp[10];++i) 
        { 
            if(!val[i])  continue; 
            if(gg[i].size()>=2) 
            {
                if(!mer[i]||mer[i]>gg[i][0].x+gg[i][1].x) 
                   mer[i]=gg[i][0].x+gg[i][1].x,a1[i]=gg[i][0].id, a2[i]=gg[i][1].id;   
            }
            for(j=i+1;j<=tmp[10];++j) 
            { 
                if(!val[j])   continue;  
                if(!mer[i|j]||(mer[i|j]>val[i]+val[j]))  
                {
                    mer[i|j]=val[i]+val[j];             
                    a1[i|j]=id[i]; 
                    a2[i|j]=id[j];         
                } 
            }
        }   
        int mx=0;   
        for(i=1;i<=tmp[10];++i) 
        { 
            if(!mer[i]) continue;    
            tot[i]=0;     // 枚举结合完的              
            for(j=1;j<=tmp[10];++j)   { if((i&j)==j)   tot[i]+=v[j];  }
            if(!mx||(tot[i]>tot[mx])||(tot[i]==tot[mx]&&mer[i]<mer[mx]))   mx=i; 
        }       
        // printf("%lld %d
    ",mer[mx],tot[mx]); 
        printf("%d %d
    ",a1[mx],a2[mx]);   
        return 0; 
    }
    

      

  • 相关阅读:
    layoutSubviews, setNeedsLayout, layoutIfNeeded
    UIViewController 专题
    UIBarButtonItem
    ios method swizzling
    Method Swizzling
    ios逆向工程
    IOS中通知中心NSNotificationCenter应用总结
    Swift 进阶
    swift 2.0 语法 字符串
    C++Builder中MessageBox的基本用法
  • 原文地址:https://www.cnblogs.com/guangheli/p/11821093.html
Copyright © 2011-2022 走看看