题意:

      给你n个数,让你从选择k个数,然后排成一个环(k个数的顺序随意,但是排成一个环后就不能变了),然后可以在这个环上任意的找连续w个数(w<=k),可以找多次,得到一个值等于当前找的连续的数的异或和,最后问你能找到>=L&&<=R的最大的R,L,R之间的数必须全部存在,给你N,K,L,求最大的R.

思路:

      直接先暴力找到k个数(最多C(20,6)),然后在枚举这k个数的全排列(全排列有STL函数,不想用可以自己深搜枚举),对于每一个序列求出所有可能解,找到最大的R,更新答案,这里有一个很重要的剪枝,也是这个题目的核心就是在全排列之前可以先判断一下是否可能存在可以更新R的最优解,直接深搜枚举当前这k个数(不用管顺序,是找可能存在),看看组成的最大的是否比当前的最大R大,如果不是,那么就没必要全排列再去枚举了,时间复杂度
深搜判断是 O(2^5) 而直接来全排列+枚举是 O(5! * 5 * 5),题目说的是随机数据,所以不存在那种全是极端数据,也就是所有情况都满足的数据,所以相比之下,还是加上那个剪枝比较合算。


#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace
std; int N ,K ,L ,R ,ks;
int
num[25] ,mark[130];
int
now[25]; void mk_jude(int k ,int sum)
{
if(
k == K + 1) return ;
mark[sum ^ now[k]] = 1;
mk_jude(k + 1 ,sum ^ now[k]);
mk_jude(k + 1 ,sum);
} int
jude(int k ,int sum)
{

memset(mark ,0 ,sizeof(mark));
mk_jude(1 ,0);
for(int
i = L ;i <= R ;i ++)
if(!
mark[i]) return 0;
return
1;
} void
dfs(int k ,int I)
{
if(
k == K + 1)
{
if(!
jude(1 ,0)) return;
int
tmp[25];
for(int
i = 1 ;i <= K ;i ++)
tmp[i] = now[i];
for(int
tt = 1 ;tt <= ks ;tt ++)
{

memset(mark ,0 ,sizeof(mark));
for(int
i = 1 ;i <= K ;i ++)
{
int
sum = 0;
for(int
j = 1 ;j <= K ;j ++)
{
int
a = i + j - 1;
if(
a > K) a -= K;
sum = sum ^ tmp[a];
mark[sum] = 1;
}
}
int
mk = 0;
for(int
i = L ;1 ;i ++)
if(!
mark[i])
{

mk = i - 1;
break;
}
if(
R < mk) R = mk;
next_permutation(tmp + 1 ,tmp + K + 1);
}
return ;
}
if(
I == N + 1) return;
now[k] = num[I];
dfs(k + 1 ,I + 1);
dfs(k ,I + 1);
} int main ()
{
int
i;
while(~
scanf("%d %d %d" ,&N ,&K ,&L))
{
for(
i = 1 ;i <= N ;i ++)
scanf("%d" ,&num[i]);
for(
R = 0 ,ks = 1 ,i = 2 ;i <= K ;i ++)
ks *= i;
dfs(1 ,1);
if(
R < L) R = 0;
printf("%d\n" ,R);
}
return
0;
}

hdu4876 深搜+(随机枚举剪枝)的更多相关文章

  1. poj1190 生日蛋糕(深搜+剪枝)

    题目链接:poj1190 生日蛋糕 解题思路: 深搜,枚举:每一层可能的高度和半径 确定搜索范围:底层蛋糕的最大可能半径和最大可能高度 搜索顺序:从底层往上搭蛋糕,在同一层尝试时,半径和高度都是从大到 ...

  2. HDU 3720 深搜 枚举

    DES:从23个队员中选出4—4—2—1共4种11人来组成比赛队伍.给出每个人对每个职位的能力值.给出m组人在一起时会产生的附加效果.问你整场比赛人员的能力和最高是多少. 用深搜暴力枚举每种类型的人选 ...

  3. USACO 2.3.3 Zero Sum 和为零(深搜枚举)

    Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...

  4. HDU-5423 Rikka with Tree。树深搜

    Rikka with Tree 题意:给出树的定义,给出树相似的定义和不同的定义,然后给出一棵树,求是否存在一颗树即和其相似又与其不同.存在输出NO,不存在输出YES. 思路:以1号节点为根节点,我们 ...

  5. 一本通例题-生日蛋糕——题解<超强深搜剪枝,从无限到有限>

    题目传送 显然是道深搜题.由于蛋糕上表面在最底层的半径确认后就确认了,所以搜索时的面积着重看侧面积. 找维度/搜索面临状态/对象:当前体积v,当前外表面面积s,各层的半径r[],各层的高度h[]. 可 ...

  6. 一本通例题埃及分数—题解&&深搜的剪枝技巧总结

    一.简述: 众所周知,深搜(深度优先搜索)的时间复杂度在不加任何优化的情况下是非常慢的,一般都是指数级别的时间复杂度,在题目严格的时间限制下难以通过.所以大多数搜索算法都需要优化.形象地看,搜索的优化 ...

  7. 【笔记】「pj复习」深搜——简单剪枝

    深搜--简单剪枝 说在最前面: 因为马上要 NOIP2020 了,所以菜鸡开始了复习qwq. pj 组 T1 ,T2 肯定要拿到满分的,然后 T3 , T4 拿部分分, T3 拿部分分最常见的做法就是 ...

  8. 深搜+DP剪枝 codevs 1047 邮票面值设计

    codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description ...

  9. Hdu3812-Sea Sky(深搜+剪枝)

    Sea and Sky are the most favorite things of iSea, even when he was a small child.  Suzi once wrote: ...

随机推荐

  1. 【读书笔记】Linux命令行与Shell脚本编程大全

    Linux命令行与Shell脚本编程大全 5.2 shell 的父子关系 命令分组 Command Grouping 主要有两种形式: 一种以小括号包括,命令之间以冒号分隔.也被称为 进程列表: 注意 ...

  2. Java 虚拟机详解

    深入理解JVM 1   Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言.Java类文件格式.Java虚 ...

  3. 2020年12月-第01阶段-前端基础-HTML常用标签

    1. HTML常用标签 首先 HTML和CSS是两种完全不同的语言,我们学的是结构,就只写HTML标签,认识标签就可以了. 不会再给结构标签指定样式了. HTML标签有很多,这里我们学习最为常用的,后 ...

  4. windows基线检测脚本编写指南-powershell版

    前言:   因为工作的原因,要写windows下的基线检查脚本.之前没接触过,在网上找了半天也没找到现成的,无奈只好自己研究,最后还是成功完成了工作. 在我编写之后发现windows下的基线基本就是检 ...

  5. java 给时间增加时间得到一个新的时间(日期)

    SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd") LocalDate expirationDate String exp ...

  6. [Redis知识体系] 一文全面总结Redis知识体系

    本系列主要对Redis知识体系进行详解.@pdai Redis教程 - Redis知识体系详解 知识体系 学习资料 知识体系 知识体系 相关文章 首先,我们通过学习Redis的概念基础,了解它适用的场 ...

  7. 60秒定位问题,十倍程序员的Debug日常

    作者:陶建辉 这是我在 2020 年 5 月写的一篇内部博客,当时是希望研发和技术支持同学能够帮助用户快速定位 Bug,解决问题.2020 年 12 月我又迭代了一版,并还针对此进行了内部的培训.这段 ...

  8. Linux Shell 统计一(行\列)数值的总和及行、列转换

    (对一列数字求和) 在日常工作当中需要对文本过滤出来的数字进行求和运算,例如想统计一个MySQL分区表现在有多大 # ls -lsh AdPlateform#P#p*.ibd  |grep G 2.6 ...

  9. IPFS挖矿靠谱吗?

    IPFS是一个旨在创建持久且分布式存储和共享文件的网络传输协议,前景广阔且实用意义大,为区块链行业提供了一种新的可能.而IPFS挖矿挖出的FIL,则是在IPFS技术的基础上,对维护IPFS网络的用户的 ...

  10. 阿里一面CyclicBarrier和CountDownLatch的区别是啥

    引言 前面一篇文章我们<Java高并发编程基础三大利器之CountDownLatch>它有一个缺点,就是它的计数器只能够使用一次,也就是说当计数器(state)减到为 0的时候,如果 再有 ...