GT and set

 Accepts: 35
 Submissions: 194
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
有NN个集合,每个集合中有A_iA​i​​个数。
你要将这NN个集合划成LL个部分,使得每个部分的集合至少有一个共有的数。
如果至少有一个解输出YESYES,否则输出NONO
输入描述
第一行一个数T表示数据组数。(TT\leq≤2020)

对于每一组数据:
第一行两个数NN和LL。
接下来NN行每行描述一个集合:
第一个数A_iA​i​​表示该集合的大小,之后xx个互不相同的整数表示该集合的元素。
集合里的数字都是正整数且不大于300300. 1\leq1≤NN\leq30≤30,1\leq1≤L\leq5L≤5,1\leq1≤A_iA​i​​\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
Hint
对于第二个样例,有三个集合{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+暴力的更多相关文章

  1. HDU - 4339: Query(bitset暴力找下一个为1的)

    题意:给定A,B长度相同的字符串,Q次操作,修改操作位单个字符修改,查询操作为询问从某点开始有多少连续相同的字符. 思路:我们把不相同的设为1,相同的设为0,那么询问就是找下一个为1的为位置,可以用线 ...

  2. HDU 1557 权利指数 国家压缩 暴力

    HDU 1557 权利指数 状态压缩 暴力 ACM 题目地址:HDU 1557 权利指数 题意:  中文题,不解释. 分析:  枚举全部集合,计算集合中的和,推断集合里面的团体是否为关键团队. 代码: ...

  3. HDU 1524 树上无环博弈 暴力SG

    一个拓扑结构的图,给定n个棋的位置,每次可以沿边走,不能操作者输. 已经给出了拓扑图了,对于每个棋子找一遍SG最后SG和就行了. /** @Date : 2017-10-13 20:08:45 * @ ...

  4. HDU 3131 One…Two…Five! (暴力搜索)

    题目链接:pid=3131">HDU 3131 One-Two-Five! (暴力搜索) 题意:给出一串数字,要求用加,减,乘,除(5/2=2)连接(计算无优先级:5+3*6=8*6= ...

  5. 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 ...

  6. HDU 5745 La Vie en rose 暴力

    La Vie en rose 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5745 Description Professor Zhang woul ...

  7. HDU 4920 Matrix multiplication(bitset)

    HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑.结果就过了.然后看了官方题解,上面是用 ...

  8. HDU 4858 项目管理(邻接表 暴力模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可 ...

  9. hdu 5475 An easy problem(暴力 || 线段树区间单点更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=5475 An easy problem Time Limit: 8000/5000 MS (Java/Others ...

随机推荐

  1. Python爬虫学习教程:天猫商品数据爬虫

    天猫商品数据爬虫使用教程 下载chrome浏览器 查看chrome浏览器的版本号,下载对应版本号的chromedriver驱动 pip安装下列包 pip install selenium pip in ...

  2. /var/lib/gems/2.5.0/gems/seccomp-tools-1.3.0/lib/seccomp-tools/dumper.rb:125: warning: Insecure world writable dir /home/python/.local in PATH, mode 040777 解决方案

    /var/lib/gems/2.5.0/gems/seccomp-tools-1.3.0/lib/seccomp-tools/dumper.rb:125: warning: Insecure worl ...

  3. java编码格式大讲解

    oracle 分页: -- 第一种 select * from (select aed.*, row_number() over(order by aed.created_date) rw from ...

  4. FastDFS上传文件访问url地址直接下载

    fdfs 存储节点storage安装nginx,修改nginx配置文件 location ~/group[1-9]/M00 {  if ( $query_string ~* ^(.*)paramete ...

  5. Golang redis 学习指南

    安装 我使用的是 https://github.com/go-redis/r... 这个 golang 客户端, 因此安装方式如下: go get gopkg.in/redis.v4 接着在代码中导入 ...

  6. Servlet的基本使用

    1.pom.xml导入包 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax ...

  7. Git 工作区、暂存区和版本库、操作流程

    Git 工作区.暂存区和版本库 基本概念 我们先来理解下Git 工作区.暂存区和版本库概念 工作区:就是你在电脑里能看到的目录. 暂存区:英文叫stage, 或index.一般存放在 ".g ...

  8. linux 环境下安装 MySQL

    参考: Linux安装MySQL5.7 注意: 安装后 出现 navicat MySQL连接Linux下MySQL的及2003错误  需要看下 虚拟机的防火墙是否关闭!!!

  9. mcast_block_source函数

    #include <errno.h> #include <sys/socket.h> #define SA struct sockaddr int mcast_block_so ...

  10. CentOS上安装elasticsearch

    1.安装docker yum install docker 2.启动docker systemctl start docker 查看docker版本: docker -v 之后只要启动机器就会自动开启 ...