HDU 5506:GT and set bitset+暴力
GT and set
有NN个集合,每个集合中有A_iAi个数。
你要将这NN个集合划成LL个部分,使得每个部分的集合至少有一个共有的数。
如果至少有一个解输出YESYES,否则输出NONO
第一行一个数T表示数据组数。(TT\leq≤2020) 对于每一组数据:
第一行两个数NN和LL。
接下来NN行每行描述一个集合:
第一个数A_iAi表示该集合的大小,之后xx个互不相同的整数表示该集合的元素。
集合里的数字都是正整数且不大于300300. 1\leq1≤NN\leq30≤30,1\leq1≤L\leq5L≤5,1\leq1≤A_iAi\leq10≤10,1 \leq L \leq N1≤L≤N hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
对于每组数据输出一行YESYES或NONO
2
2 1
1 1
1 2
3 2
3 1 2 3
3 4 5 6
3 2 5 6
NO
YES
对于第二个样例,有三个集合{1 2 3},{4 5 6},{2 5 6} 你要划成两个部分。
有一种方案是把第二个和第三个集合划成一个部分,第一个在另一个部分。有一种方案是把第二个和第三个集合划成一个部分,第一个在另一个部分。 第二个和第三个集合的数字有一个交集{6},所以合法。
还有一种划分方案就是把第一个和第三个集合划成一个部分,第二个在另一个部分。
题解:
可能一些选手题意不是很清楚,我这里再提供一个转化后的问题:给出N个集合。每次你可以指定一个数,然后所有包含这个元素的集合可以被删掉。问你能否经过最多L轮操作使得所有集合都被删掉。因为LL只有5,考虑直接dfs。对于第一个集合,我们枚举它的那个公共的数是多少。然后线性扫描过去,找到接下来第一个没有这个数的集合。(它显然不能通过这个公共的数与第一个数在同一个部分)。对于这个集合,再枚举它公共的数是多少,然后线性扫描过去找到第一个没有这两个数的集合……这样重复5次后如果还是没有,就直接NO好了。若中途扫完序列就是YES。
自己也写了一个dfs暴力,但不知道为什么一直TLE。。。ORZ。。。
学习了别人的代码之后,发现就是:哇塞,竟然还可以这样搞。。。
其实自己之前做poj有一道题目与此类似,但是自己还是没能想到ORZ。。。。就是如果只判断一个数是否在一个集合里面,只有两个状态,这个数还不大的话,那么bitset一定要加入考虑的范围。
具体解释见代码:
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <bitset>
using namespace std; int n, divide;//表示当前集合数和所要的划分数
bitset<305>set[35];//表示该集合里面有哪些数,一共最多30个集合 int dfs(int id, bitset<305>*tmp)
{
if (id == n)//如果能够抵达n,说明n个集合都已经划分好了,自然正确了
{
return 1;
}
bitset<305>ans[35];
for (int i = 0; i < divide; i++)//tmp代表各个划分当前的状态,即这个划分中是靠哪一个数来维系的
{
ans[i] = tmp[i];
}
for (int i = 0; i < divide; i++)//枚举该集合能弄到哪一个划分中,没有可去的就单独到一个划分里面去
{
ans[i] = tmp[i]&set[id];
if (ans[i].count())//说明这个集合和之前的集合有交集,即可以放入到这个划分中,扫下一个集合
{
if (dfs(id + 1, ans))
return 1;
}
ans[i] = tmp[i];//该集合不放入到这个划分中
}
return 0;
} int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout); int t, cnt, x;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, ÷); bitset<305>tmp[35];
for (int i = 0; i < n; i++)
{
scanf("%d", &cnt);
set[i].reset();
for (int j = 0; j < cnt; j++)
{
scanf("%d", &x);
set[i][x] = 1;
}
for (int j = 0; j <= 300; j++)
{
tmp[i][j] = 1;
}
}
int flag = dfs(0, tmp);
if (flag)
puts("YES");
else
puts("NO");
} //system("pause");
return 0;
}
HDU 5506:GT and set bitset+暴力的更多相关文章
- HDU - 4339: Query(bitset暴力找下一个为1的)
题意:给定A,B长度相同的字符串,Q次操作,修改操作位单个字符修改,查询操作为询问从某点开始有多少连续相同的字符. 思路:我们把不相同的设为1,相同的设为0,那么询问就是找下一个为1的为位置,可以用线 ...
- HDU 1557 权利指数 国家压缩 暴力
HDU 1557 权利指数 状态压缩 暴力 ACM 题目地址:HDU 1557 权利指数 题意: 中文题,不解释. 分析: 枚举全部集合,计算集合中的和,推断集合里面的团体是否为关键团队. 代码: ...
- HDU 1524 树上无环博弈 暴力SG
一个拓扑结构的图,给定n个棋的位置,每次可以沿边走,不能操作者输. 已经给出了拓扑图了,对于每个棋子找一遍SG最后SG和就行了. /** @Date : 2017-10-13 20:08:45 * @ ...
- HDU 3131 One…Two…Five! (暴力搜索)
题目链接:pid=3131">HDU 3131 One-Two-Five! (暴力搜索) 题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6= ...
- hdu 5506 GT and set dfs+bitset优化
GT and set Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Probl ...
- HDU 5745 La Vie en rose 暴力
La Vie en rose 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5745 Description Professor Zhang woul ...
- HDU 4920 Matrix multiplication(bitset)
HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑.结果就过了.然后看了官方题解,上面是用 ...
- HDU 4858 项目管理(邻接表 暴力模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可 ...
- hdu 5475 An easy problem(暴力 || 线段树区间单点更新)
http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...
随机推荐
- php redis 集群扩展类文件
<?php /** * redis集群驱动 */ namespace Common\Api; class RedisCluster{ protected $servers=array( '192 ...
- Python爬虫学习教程:天猫商品数据爬虫
天猫商品数据爬虫使用教程 下载chrome浏览器 查看chrome浏览器的版本号,下载对应版本号的chromedriver驱动 pip安装下列包 pip install selenium pip in ...
- selenium+python+unittest实现自动化测试(入门篇)
本文主要讲解关于selenium自动化测试框架的入门知识点,教大家如何搭建selenium自动化测试环境,如何用selenium+python+unittest实现web页面的自动化测试,先来看看se ...
- Introducing .NET 5
Today, we’re announcing that the next release after .NET Core 3.0 will be .NET 5. This will be the n ...
- idea搭建项目注意事项
1,pom.xml文件中要加入 <!-- 强制将xml文件打到war包中 s--><resources> <resource> <directory> ...
- Vue——前端生成二维码
与后端生成二维码相比,前端生成二维码更具有灵活性,下面就介绍两种前端生成二维码的方式,两种方式相比之下,vue-qr比qrcode多了一个再中间添加logo的功能. 方式一:qrcode npm np ...
- 洛谷P1073最优贸易(跑两遍dij)
题目描述 CC C国有n n n个大城市和m mm 条道路,每条道路连接这 nnn个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路,一部分为 ...
- 转入软工后第一节java课的作业
这个作业,鸽了好久.本来大家都在中秋前发了,我摸摸索索加上各种缓慢的学习,终于是将他做完了. 做完之后,java最基本的输入输出功能都基本学习到了.下面附上代码: import java.util.* ...
- BinaryTree(二叉树)
我认为二叉树的递归实现体现了递归思想的一些重要性质,如果对递归的理解不够的话,想利用递归来实现是很费劲的(实际上我现在都还有些懵...),虽然会用,但一些地方不能弄清楚原因. 经过几天的学习,看了许多 ...
- SpringBoot启动使用elasticsearch启动异常:Received message from unsupported version:[2.0.0] minimal compatible
SpringBoot启动使用elasticsearch启动异常:Received message from unsupported version:[2.0.0] minimal compatible ...