2014 Multi-University Training Contest 2

HDU 4876 ZCC loves cards

题意:n个数,任选k个,形成一个环,每次在环上最多选k个连续的数异或和,得到一个r,问最大R是多少,并且[L,R]之间所有数都可以取到

思路:数小,可以直接枚举C(n,k),每次组合之前判断当前选择的数能不能满足前一个r范围之内所有数,否则不行;这样剪枝O(2^6)。否则,每次判断全排列,O(5!*n*n);所以剪枝更优

环全排列:O((n-1)!)

  1 // #pragma comment(linker, "/STACK:102c000000,102c000000")
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <sstream>
  6 #include <string>
  7 #include <algorithm>
  8 #include <list>
  9 #include <map>
 10 #include <vector>
 11 #include <queue>
 12 #include <stack>
 13 #include <cmath>
 14 #include <cstdlib>
 15 // #include <conio.h>
 16 using namespace std;
 17 #define clc(a,b) memset(a,b,sizeof(a))
 18 #define inf 0x3f3f3f3f
 19 #define lson l,mid,rt<<1
 20 #define rson mid+1,r,rt<<1|1
 21 const int N = 2e5+10;
 22 const int M = 1e6+10;
 23 const int MOD = 1e9+7;
 24 #define LL long long
 25 #define mi() (l+r)>>1
 26 double const pi = acos(-1);
 27 const double eps = 1e-8;
 28 void fre() {
 29     freopen("in.txt","r",stdin);
 30 }
 31 // inline int r() {
 32 //     int x=0,f=1;char ch=getchar();
 33 //     while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
 34 //     while(ch>='0'&&ch<='9') { x=x*10+ch-'0';ch=getchar();}return x*f;
 35 // }
 36 int a[25],tem[25];
 37 int r;
 38 int n,k,l;
 39 bool vis[255];
 40 
 41 void judge2(int sum,int dep){
 42      if(dep==k+1) return;
 43      vis[sum]=true;
 44      judge2(sum^tem[dep],dep+1);
 45      judge2(sum,dep+1);     
 46 }
 47 
 48 bool judge1(){
 49     clc(vis,0);
 50     judge2(0,0);
 51     for(int i=l;i<=r;i++){
 52         if(!vis[i])
 53             return false;
 54     }
 55     return true;
 56 }
 57 
 58 int b[25];
 59 void work(){
 60     if(!judge1()){
 61         return;
 62     }
 63     for(int i=0;i<k;i++){
 64         b[i]=tem[i];
 65     }
 66     do{
 67        clc(vis,0);
 68        for(int i=0;i<k;i++){
 69             int sum=0;
 70             for(int j=i;j<i+k;j++){
 71               sum^=b[j%k];
 72               vis[sum]=true;
 73             }
 74             for(int j=l;j<=105;j++){
 75                 if(!vis[j]){
 76                 r=max(r,j-1);
 77                 break;
 78                 }
 79             }
 80         }
 81     }while(next_permutation(b+1,b+k));
 82 }
 83 void dfs(int st,int dep){
 84     if(dep==k){
 85         work();
 86         return;
 87     }
 88     for(int i=st;i<n;i++){
 89         tem[dep]=a[i];
 90         dfs(i+1,dep+1);
 91     }
 92 }
 93 int main(){
 94     // fre();
 95     while(~scanf("%d%d%d",&n,&k,&l)){
 96         for(int i=0;i<n;i++){
 97             scanf("%d",&a[i]);
 98         }
 99         sort(a,a+n);
100         r=l-1;
101         dfs(0,0);
102         if(r<l)
103             printf("0\n");
104         else
105             printf("%d\n",r);
106     }
107     return 0;
108 }

 

posted @ 2016-07-23 16:51  yyblues  阅读(212)  评论(0编辑  收藏  举报