2014 Multi-University Training Contest 2
题意: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 }