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 ...
随机推荐
- 【php】new static的用法
在一个类中,常见的是new self()操作,代表返回自身类的实例. 当父类中存在方法,然后每个子类继承于父类,调用这个方法会返回自身的实例化对象, <?php class A { functi ...
- 二分图最大匹配模板(pascal)
uoj#78. 二分图最大匹配 从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv ...
- Mininet 系列实验(七)
实验内容 本实验在基于 Mininet 脚本的不同拓扑环境下使用 OpenDaylight 控制交换机行为.任务一:一台交换机两台主机,从1端口进入的数据流转发到 2 端口,从 2 端口进入的数据流转 ...
- bzoj 4521: [Cqoi2016]手机号码
感觉get到了一种数位dp的新姿势,加一位表示当前要填的数有没有限制(感觉以前的写法都太蠢了). 这么写有两个地方要注意: 1.每dp到一位时需要f[i][初始状态]++,相当于这位前都是前导零(这道 ...
- 团体程序设计天梯赛 L1-010. 比较大小
测试数据: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 Code: 先确定最小,然后确定第二小 #include <stdio.h> #include < ...
- Tensorflow实战Google深度学习框架-总结-1
第一章:深度学习简介 1⃣️应用有 1.计算机视觉 2.语音识别 3.自然语言处理 4.人机博弈 2⃣️深度学习,机器学习,AI 的关系
- 《编程快速上手》--web抓取--利用webbrowser模块的mapIT.py
1.代码如下 #! python3 # mapIT.py - Launches a map in the browser using an address from the # command lin ...
- linux命令总结kill命令详解
1.作用 kill命令用来中止一个进程. 2.格式 kill [ -s signal | -p ] [ -a ] pid ... kill -l [ signal ] 3.参数 -s:指定发送的信号. ...
- linux命令总结之route命令
route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以下问题:该Linu ...
- Zabbix应用四:Zabbix监控Nginx
利用Zabbix监控Nginx 一.准备nginx监控模版: 1.1.下载nginx监控模版: 点此下载 1.2.导入模版: Zabbix管理页面,选择'配置'->'模版'->'导入': ...