多校7 HDU5816 Hearthstone 状压DP+全排列
多校7 HDU5816 Hearthstone 状压DP+全排列
题意:boss的PH为p,n张A牌,m张B牌。抽取一张牌,能胜利的概率是多少?
如果抽到的是A牌,当剩余牌的数目不少于2张,再从剩余牌里抽两张,否则全部拿完。
每次拿到一张B牌,对boss伤害B[i]的值
思路:dp[i]表示状态为i时的方案数
先处理出所有状态下的方案,再枚举每种状态,如果符合ans+=dp[i]*剩余数的全排列
当前集合里有a张A,b张B,那么还能取的牌数:a*-a-b+ #include <bits/stdc++.h>
using namespace std;
#define LL long long
const int inf = 0x3f3f3f3f;
const int MOD =;
const int N =;
#define clc(a,b) memset(a,b,sizeof(a))
const double eps = 1e-;
void fre() {freopen("in.txt","r",stdin);}
void freout() {freopen("out.txt","w",stdout);}
inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-;ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;}
int n,m,p;
LL dp[<<];
int B[];
LL fac[]={};
int main(){
fac[]=;
for(int i=;i<;i++) fac[i]=fac[i-]*i;
int T,sum,a,b;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&p,&n,&m);
int N=n+m;
for(int i=;i<<<N;i++) dp[i]=;
for(int i=n;i<N;i++) scanf("%d",&B[i]); dp[]=,sum=,b=,a=;
for(int i=;i<<<N;i++){
if(dp[i]==) continue;
sum=,a=,b=;
for(int j=n;j<N;j++){
if(i&(<<j)){
sum+=B[j];
b++;
}
}
if(sum>=p)continue;
for(int j=;j<n;j++){
if(i&(<<j)){
a++;
}
}
if(a-b+<=) continue;
for(int j=;j<N;j++){
if((i&(<<j))==){
dp[i|(<<j)]+=dp[i];
}
}
}
LL Den=fac[N],Mol=;
for(int i=;i<(<<N);i++){
a=,b=,sum=;
for(int j=n;j<N;j++){
if(i&(<<j)){
b++;sum+=B[j];
}
}
if(sum<p) continue;
for(int j=;j<n;j++){
if(i&(<<j)){
a++;
}
}
Mol+=(LL)dp[i]*fac[N-b-a];
}
LL g=__gcd(Mol,Den);
printf("%I64d/%I64d\n",Mol/g,Den/g);
}
return ;
} 解法2标程:O(^m)
f[i][j]表示A拿i张,B拿j张的方案数
方法用f[i][j]表示A类牌和B类牌分别抽到i张和j张,且抽牌结束前保证i>=j的方案数,这个数组可以用O(n^)的dp预处理得到.
接下来枚举B类牌的每个子集,如果这个子集之和不小于P,用k表示子集的1的个数,将方案总数加上取到这个集合刚好A类卡片比B类卡片少一(过程结束)的方案数:f[k-][k] * C(n, k - ) * (k - )! * k! * (n + m – *k + )! .
如果子集包含了所有的B类卡片,则还需要再加上另一类取牌结束的情况,也就是取完所有牌,此时应加上的方案数为f[n][m] * n! * m! .
最后的总方案数除以(n+m)!就是答案. #include <cstdio>
typedef long long lli; int bc[<<], sum[<<], tmp[<<];
int C[][];
lli f[][], fact[]; lli gcd(lli a, lli b)
{
if (b == ) return a;
return gcd(b, a % b);
} void init()
{
int i, j;
bc[] = ;
for (i=; i<(<<); i++) bc[i] = bc[i^(i&-i)] + ;
fact[] = ;
for (i=; i<=; i++) fact[i] = fact[i-] * i;
C[][] = ;
for (i=; i<=; i++)
{
C[i][] = C[i][i] = ;
for (j=; j<i; j++) C[i][j] = C[i-][j] + C[i-][j-];
}
f[][] = f[][] = ;
for (i=; i<=; i++)
{
f[i][] = ;
for (j=; j<i; j++) f[i][j] = f[i-][j] + f[i][j-];
f[i][i] = f[i][i+] = f[i][i-];
}
} int main()
{
lli a, b, d;
int p, n, m, t, i;
init();
scanf("%d", &t);
while (t --)
{
scanf("%d %d %d", &p, &n, &m);
for (i=; i<m; i++) scanf("%d", &tmp[<<i]);
sum[] = ;
for (i=; i<(<<m); i++) sum[i] = sum[i^(i&-i)] + tmp[i&-i];
a = ;
for (i=; i<(<<m); i++)
{
if (sum[i] >= p && bc[i] <= n + )
{
a += C[n][bc[i]-] * f[bc[i]-][bc[i]] * fact[bc[i]-] * fact[bc[i]] * fact[n+m-*bc[i]+];
if (bc[i] == m && bc[i] < n + ) a += f[n][m] * fact[n] * fact[m];
}
}
b = fact[n+m];
d = gcd(a, b);
printf("%I64d/%I64d\n", a / d, b / d);
}
return ;
}
多校7 HDU5816 Hearthstone 状压DP+全排列的更多相关文章
- hdu-5816 Hearthstone(状压dp+概率期望)
题目链接: Hearthstone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU5816 Hearthstone(状压DP)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5816 Description Hearthstone is an online collec ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
- 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集
maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj 3254Corn Fields (入门状压dp)
Farmer John has purchased a lush ≤ M ≤ ; ≤ N ≤ ) square parcels. He wants to grow some yummy corn fo ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- Quartz 并发/单线程
Quartz 并发/单线程 Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞.1.在Spring中这 ...
- 示例:Servlet显示当前系统时间(时间格式化)
package com.mhb; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDate ...
- MyEclipse 2014GA 新建 Web Project 并配置 SSH
基本软件配置: 1)MyEclipse 2014GA(JDK:内置 1.7.0.u45:SSH:内置 Struts2.1.Spring3.1 和 Hibernate4.1) 2)apache- ...
- windows下python脚本程序的运行
c:\python33\python.exe c:\python33\trycoding.py
- 网站TCP链接暴增
昨天上线后,TCP链接暴增,红点增多. 问题在查.其中有一部分,多线程修改,突破了线程数 64的限制.线程内,会发起网络请求. 怀疑是热点之一.其他的部分也有修改,也被怀疑.准备下次,2部分分开上线. ...
- Zookeeper、HBase的伪分布
1.Zookeeper伪分布的部署(3个节点) 所谓的“伪分布式集群”就是在一台服务器中,启动多个Zookeeper实例.“完全分布式集群”是每台服务器,启动一个Zookeeper实例. 1.1.解压 ...
- 在BSP的.bat文件下設置全局變量方法
用于多個產品共用一個BSP的時候,在BSP的.bat文件中設置全局變量,去掉不需要加載的驅動和不同點是很好的方法. 一,舉例:BSP中.bat的一段code: set BSP_SMDK2443=1 s ...
- R语言字符串函数
字符串长度: nchar("hello world") #字符串连接:paste) <- value substr("abcdef", 2, 4)[1] ...
- ASP.NET Web API上实现 Web Socket
1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...
- ZOJ 3607 Lazier Salesgirl(贪心)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3607 题意:一个卖面包的小姑娘,给第i个来买面包的人的价格是pi, ...