zoukankan      html  css  js  c++  java
  • HDU 4876 ZCC loves cards _(:зゝ∠)_ 随机输出保平安


    GG,,,g艹

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <queue>
    #include <math.h>
    using namespace std;
    vector<int>G[21][7];//G[i][j] 表示n=i k=j的情况下 二进制的状态
    int n, k, l;
    int a[21], d[6], val[6];
    int vis[150], tim;
    int work(int x){
        int i = 0, j = 0;
        while(x) {
            if(x&1)    d[i++] = j;//a[j]
            j++;
            x>>=1;
        }
        int ans = 0;
        do
        {
            memset(val, 0, sizeof val);
            tim ++;
            int st = 0;
            for(int num = 0; num < k; num++) {
                i = st; j = 0;
                while(1) {
                    val[j] ^= a[d[i]];
                    vis[val[j]] = tim;
                    i++; j++;if(i>=k)i=0;
                    if(i==st)break;
                }
                st++;
            }
            for(i = l; ; i++)
                if(vis[i]!=tim)
                {
                    ans = max(ans, (i-1)>=l? (i-1):0);
                    break;
                }
        } while (next_permutation(d + 1, d + k));
        return ans;
    }
    void dfs(int dep, int cnt, int num) {
        if (dep > 20 || cnt > 6) return ;
        G[dep][cnt].push_back(num);
        dfs(dep + 1, cnt + 1, num | (1 << dep));
        dfs(dep + 1, cnt, num);
    }
    
    struct Node {
        int cnt, idx;
        bool operator < (const Node &rhs) const {
            return cnt > rhs.cnt;
        }
    };
    
    Node qq[24];
    int b[24];
    
    int cmp(int a, int b) {
        return a > b;
    }
    
    int main(){
        int i, j;
        for(i = 1; i <= 20; i++)
            for(j = 1; j <= 6; j++) G[i][j].clear();
        dfs(0, 0, 0);
        tim = 100;
        while(~scanf("%d %d %d",&n, &k, &l)) {
            for(i = 0; i < n; i++)scanf("%d",&a[i]);
            
            int ans = 0, siz = (int)G[n][k].size();
            if (siz <= 12000) {
                for (int i = 0; i < siz; ++i) {
                    int cur = G[n][k][i];
                    ans = max(ans, work(cur));
                  }
            } else if (siz <= 24001) {
                for (int i = 1; i < siz; i += 2) {
                    int cur = G[n][k][i];
                    ans = max(ans, work(cur));
                }
            } else {
                for (int i = 0; i < siz; i += 3) {
                    int cur = G[n][k][i];
                    ans = max(ans, work(cur));
                }
            }
            
            printf("%d
    ",ans);
        }
        return 0;
    }


  • 相关阅读:
    【转】把VS的智能提示快捷键改成Eclipse的习惯
    论文的写作 —— 参考文献的格式
    论文的写作 —— 参考文献的格式
    OpenMP并行编程应用—加速OpenCV图像拼接算法
    计算广告(computational advertising)
    计算广告(computational advertising)
    开源|LightGBM:三天内收获GitHub 1000+ 星
    Logistic Regression 的简单推导
    Logistic Regression 的简单推导
    在电影里走遍中国
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3946675.html
Copyright © 2011-2022 走看看