首页 >> 大全

Hearthstone

2023-11-12 大全 25 作者:考证青年

题意:

有$n$个无中生有,有$m$个不同的杀,第$i$个杀掉$X_i$滴血,敌人血量$P$,求问第一回合就将敌人杀死概率是多少。

解法:

二进制枚举$A$类,$B$类卡的顺序,这样就确定了取了几个$B$卡,dp即可

$f(i,j)$表示选了$i$个卡,伤害和为$j$的方案数。

$ans = \sum {f(j,P)j!(m-j)!}$

总效率$O(n 2^{n+m})$

认真读题。

hearthstone国际服_hearthstone怎么读_

#include 
#include 
#include #define LL unsigned long long
#define N 23
#define bit(x) (1<<(x))using namespace std;int P, n, m;
int X[N];
LL f[N][N][1010], comb[N][N], fac[N];LL gcd(LL a, LL b) {if (b == 0) return a;return gcd(b, a % b);
}int main() {comb[0][0] = 1;fac[0] = 1;for (int i = 1; i <= 20; i++) {fac[i] = fac[i-1] * i;comb[i][0] = 1;for (int j = 1; j <= i; j++)comb[i][j] = comb[i-1][j-1] + comb[i-1][j];}int T;scanf("%d", &T);while (T--){memset(f, 0, sizeof(f));scanf("%d %d %d", &P, &n, &m);X[0] = 0;for(int i = 1; i <= m; i++) scanf("%d", &X[i]);f[0][0][0] = 1;for(int i = 0; i < m; i++)for(int j = 0; j <= i; j++)for(int k = P; k >= 0; k--){f[i+1][j][k] += f[i][j][k];f[i+1][j+1][min(k+X[i+1],P)] += f[i][j][k];}LL ans0 = 0, ans1 = 0;for(int S=0;S<(1<<(n+m));S++){int cnt=0,i,j=0;for(i=0;iif(bit(i)&S) cnt++;if(cnt!=m) continue;ans1 += fac[m];cnt=1;for(i=0;i){if(bit(i)&S) cnt--, j++;else cnt++;}ans0 += f[m][j][P] * fac[m-j] * fac[j];}if(ans0 == 0) {puts("0/1");continue;}LL d = gcd(ans0, ans1);cout << ans0/d << '/' << ans1/d << endl;}return 0;
}

View Code

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了