zoukankan      html  css  js  c++  java
  • 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
    ");
    104         else
    105             printf("%d
    ",r);
    106     }
    107     return 0;
    108 }
  • 相关阅读:
    【2017.12.02普及组模拟】送快递
    【NOIP2013模拟联考7】OSU
    顺序表元素位置倒置示例c++实现
    c++字符串排序
    JAVA实现四则运算的简单计算器
    JAVA图形小动画之简单行星运动
    JAVA多线程编程
    ege图形库之简单贪吃蛇(c++)
    ege图形库之动画排序
    c语言中一种典型的排列组合算法
  • 原文地址:https://www.cnblogs.com/ITUPC/p/5699064.html
Copyright © 2011-2022 走看看