2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Frequent Subsets Problem (状态压缩)
题目翻译:
给出一个数n,和一个浮点数a,数n代表全集U = {1,2,...,n},然后给出
M个U的子集,如果一个集合B(是U的子集),M个集合中有至少M*a个集合包含B,
则B这个集合就是一个满足条件的集合,统计U的子集中B这种集合的个数。
对于N个数的集合,其子集,可以从N个里面挑1个,挑2个,。。。挑N个数构成。
C(n,0)+ C(n,1) + C(n,2) + C(n,3) + ..... + C(n,n) = (1+1)^n = 2^n
N个数子集共有2^n种状态,其中每一个数都代表一个状态,意思就是代表一个子集。
对于输入的M个集合。集合的状态就是2^(num-1)的和。
为何这样?
加入现有一个集合:
1 3 6 10
把它算成 2^(1-1) + 2^(3-1) + 2^(6-1) + 2^(10-1)
这个数字可以用2进制表示:
num(数字): 10 9
8 7 6 5 4
3 2 1
binary bit(二进制位): 1 0 0 0 1 0 0 1 0 1
power(对应的权值): 2^9 2^8 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
对于每个状态,是一个数,它也是一个二进制串,二进制串中为1的位置,代表了
某个数字存在与集合M,当每个数与集合M进行与运算的时候,可以求出同为1的
二进制位,得出的数与当前这个相同,则说明当前数代表的状态是集合M的子集。
AC代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
using namespace std;
char str[1000];
int M[55];
int main()
{
int n,m;
double a;
scanf("%d %lf ",&n,&a);
memset(M,0,sizeof(M));
m = 0;
while(gets(str))
{
int num = 0;
int len = strlen(str);
for(int i = 0; i < len; i++)
{
if(str[i]==' ')
{
M[m] = M[m] + (1<<(num-1));
num = 0;
}
else
{
num = num*10 + str[i]-'0';
}
}
M[m++] += (1<<(num-1));
}
int temp = ceil(m*a);
int state = (1<<n);
int ans = 0;
for(int i = 1; i <= state; i++)
{
int sum = 0;
for(int j = 0; j < m; j++)
{
if((i&M[j]) == i)
sum++;
}
if(sum >= temp)
ans++;
}
printf("%d\n",ans);
return 0;
}
2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Frequent Subsets Problem (状态压缩)的更多相关文章
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem【状态压缩】
2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 M. Frequent Subsets Problem 题意:给定N和α还有M个U={1,2,3,...N}的子集,求子集X个数,X满足:X是U ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- ICPC 2018 徐州赛区网络赛
ACM-ICPC 2018 徐州赛区网络赛 去年博客记录过这场比赛经历:该死的水题 一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. D. Easy Math 题意: ...
- Skiing 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛H题(拓扑序求有向图最长路)
参考博客(感谢博主):http://blog.csdn.net/yo_bc/article/details/77917288 题意: 给定一个有向无环图,求该图的最长路. 思路: 由于是有向无环图,所 ...
- [刷题]ACM/ICPC 2016北京赛站网络赛 第1题 第3题
第一次玩ACM...有点小紧张小兴奋.这题目好难啊,只是网赛就这么难...只把最简单的两题做出来了. 题目1: 代码: //#define _ACM_ #include<iostream> ...
- 2016 ACM/ICPC亚洲区大连站-重现赛 解题报告
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit 1000 ms Memory li ...
- 2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!
鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS Memory Limit:262144KB 64bit IO Fo ...
- 2017ICPC南宁赛区网络赛 Minimum Distance in a Star Graph (bfs)
In this problem, we will define a graph called star graph, and the question is to find the minimum d ...
- 2017ICPC南宁赛区网络赛 Overlapping Rectangles(重叠矩阵面积和=离散化模板)
There are nnn rectangles on the plane. The problem is to find the area of the union of these rectang ...
随机推荐
- ini_set的权限大于error_reporting
在用php做网站开发的时候 , 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这 ...
- URL query string中文字符问题
如果URL的query string中包含中文字符,在不做特殊处理的情况下通过 request.getParameter 方法是获取不到正确的信息的,这是由于下面的两个机制造成的 浏览器会自动对URL ...
- BZOJ5305 HAOI2018苹果树(概率期望+动态规划)
每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...
- Tomcat8.0配置JNDI多数据源
jndi配置 :此种配置需要在Tomcat的server.xml中和context.xml中配置数据源,在项目中引用. 需要在tomcat下加入数据库连接的jar包,相关包(ojdbc14;c3p0数 ...
- C#基础-如何找到devenv的路径位置
一.前言 今年开始安装了VS2017,有时候需要使用到脚本编译,奈何MS在VS2017上的脚本编译上不再支持VS2015那种 "%VS140COMNTOOLS%vsvars32 ...
- 51nod 1678 lyk与gcd | 容斥原理
51nod 200题辣ψ(`∇´)ψ !庆祝! 51nod 1678 lyk与gcd | 容斥原理 题面 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为 ...
- AC自动机【萌新文章】
我这个蒟蒻第一次写博客,有点小激动呢. 主要是最近刚学了AC自动机,学得糟糟糕糕,记录一下,看到dalao们都在写博客,决定自己也写一波[我好水的啦,写的也不好] AC自动机大概就是 Trie+ ...
- Java之File与递归
File类的使用和递归思想 File类 概述 文件: 存储数据 文件夹: 管理文件与文件夹 构造方法 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径 ...
- 解题: SDOI 2011 染色
题面 强行把序列问题通过树剖套在树上...算了算是回顾了一下树剖的思想=.= 每次树上跳的时候注意跳的同时维护当前拼出来的左右两条链的靠上的端点,然后拼起来的时候讨论一下拼接点,最后一下左右两边的端点 ...
- 使用spring cache和ehcache
一.spring cache Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该 ...