Codeforces Gym 191033 E. Explosion Exploit (记忆化搜索+状压)
2.0 s
256 MB
standard input
standard output
In a two player card game, you have nn minions on the board and the opponent has mm minions. Each minion has a health between 11 and 66.
You are contemplating your next move. You want to play an "Explosion" spell which deals dd units of damage randomly distributed across all minions. The damage is dealt one unit at a time to some remaining minion on the board. Each living minion (including your own) has the same chance of receiving each unit of damage. When a minion receives a unit of damage, its health is decreased by one. As soon as the health of a minion reaches zero, it is immediately removed from the board, before the next damage is dealt. If there are no minions left on the board, any excess damage caused by the spell is ignored.
Given the current health of all minions, what is the probability that the Explosion will remove all of the opponent's minions? Note that it does not matter if all your own minions die in the process as well, and the damage continues to be dealt even if all your own minions are gone.
The first line of input contains the three integers nn, mm, and dd (1≤n,m≤51≤n,m≤5, 1≤d≤1001≤d≤100). Then follows a line containing nn integers, the current health of all your minions. Finally, the third line contains mm integers, the current health of all the opponent's minions. All healths are between 11 and 66 (inclusive).
Output the probability that the Explosion removes all the opponent's minions, accurate up to an absolute error of 10−610−6.
1 2 2
2
1 1
0.33333333
2 3 12
3 2
4 2 3
0.13773809 题意:
我方有n个人,敌方有m个人,你可以攻击d次。每次等概率击中一个血量不为0的人,被击中的人掉一点血。
问最后敌方全部阵亡的概率。
解法:
记忆化搜索+状压。
假如己方有三个人,血量2 3 3 和3 2 3 要看成同一种状态,否者会TLE或者会MLE
对敌方也是如此,但是不可以把敌我混起来。
代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#define fuck(x) cout<<#x<<" = "<<x<<endl;
#define ls (t<<1)
#define rs ((t<<1)+1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = ;
const int inf = 2.1e9;
const ll Inf = ;
const int mod = ;
const double eps = 1e-;
const double pi = acos(-);
int hp1[],hp2[];
int n,m,k;
map<ll,double>dp;
ll over;
ll get_state(){
ll ans=;
for(int i=;i<=;i++){
ans=ans*+hp2[i];
}
for(int i=;i<=;i++){
ans=ans*+hp1[i];
}
return ans;
}
double dfs(ll state,ll t){
if(dp.count(state)){return dp[state];}
double &res=dp[state];
if(state<over){return res=1.0;}
if(t==){return res=0.0;}
int ans=;
for(int i=;i<=;i++){
if(!hp1[i]){continue;}
ans+=hp1[i];
hp1[i]--;hp1[i-]++;
ll new_state=get_state();
res+=(hp1[i]+)*dfs(new_state,t-);
hp1[i]++;hp1[i-]--;
}
for(int i=;i<=;i++){
if(!hp2[i]){continue;}
ans+=hp2[i];
hp2[i]--;hp2[i-]++;
ll new_state=get_state();
res+=(hp2[i]+)*dfs(new_state,t-);
hp2[i]++;hp2[i-]--;
}
res/=ans;
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int x;
for(int i=;i<=n;i++){
scanf("%d",&x);
hp1[x]++;
}
for(int i=;i<=m;i++){
scanf("%d",&x);
hp2[x]++;
}
for(int i=;i<=;i++){
over=over*+;
}
printf("%.8f",dfs(get_state(),k));
return ;
}
Codeforces Gym 191033 E. Explosion Exploit (记忆化搜索+状压)的更多相关文章
- URAL 1152. False Mirrors (记忆化搜索 状压DP)
题目链接 题意 : 每一颗子弹破坏了三个邻近的阳台.(第N个阳台是与第1个相邻)射击后后的生存的怪物都对主角造成伤害- 如此,直到所有的怪物被消灭,求怎样射击才能受到最少伤害. 思路 : 状压,数据不 ...
- lightoj 1158 - Anagram Division(记忆化搜索+状压)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1158 题解:这题看起来就像是记忆搜索,由于s很少最多就10位所以可以考虑用状压 ...
- Educational Codeforces Round 1 E. Chocolate Bar 记忆化搜索
E. Chocolate Bar Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/prob ...
- codeforces 284 D. Cow Program(记忆化搜索)
题目链接:http://codeforces.com/contest/284/problem/D 题意:给出n个数,奇数次操作x,y都加上a[x],偶数次操作y加上a[x],x减去a[x],走出了范围 ...
- Codeforces 294B Shaass and Bookshelf(记忆化搜索)
题目 记忆化搜索(深搜+记录状态) 感谢JLGG //记忆话搜索 //一本书2中状态,竖着放或者横着放 //初始先都竖着放,然后从左边往右边扫 #include<stdio.h> #inc ...
- 【每日dp】 Gym - 101889E Enigma 数位dp 记忆化搜索
题意:给你一个长度为1000的串以及一个数n 让你将串中的‘?’填上数字 使得该串是n的倍数而且最小(没有前导零) 题解:dp,令dp[len][mod]为是否出现过 填到第len位,余数为mod 的 ...
- Gym 100650H Two Ends DFS+记忆化搜索
Problem H: Two EndsIn the two-player game “Two Ends”, an even number of cards is laid out in a row. ...
- Codeforces 540D Bad Luck Island - 概率+记忆化搜索
[题意] 一个岛上有三种生物A,B,C,各有多少只在输入中会告诉你,每种最多100只 A与B碰面,A会吃掉B, B与C碰面,B会吃掉C, C与A碰面,C会吃掉A...忍不住想吐槽这种环形食物链 碰面是 ...
- Codeforces 354B 博弈, DP,记忆化搜索
题意:现在有一个字符矩阵,从左上角出发,每个人交替选择一个字符.如果最后字符a数目大于字符b,那么第一个人获胜,否则b获胜,否则平均.现在双方都不放水,问最后结果是什么? 思路:这题需要注意,选择的字 ...
随机推荐
- python数据结构与算法第三天【时间复杂度计算方法】
最优时间复杂度(不可靠) 最坏时间复杂度(保证) 平均时间复杂度(平均状况) 不同语句的时间复杂度: (1)顺序语句:使用加法 (2)循环语句:使用乘法 (3)分支语句:使用坏时间复杂度 例如:如下代 ...
- oldriver
功能: 1:数据详情:统计商家所关联邮箱的商家店铺的当天或者最近一周,最近一个月的订单情况,sku,order,value,回评率数据在具体哪个国家的销售情况. 增强版提供更丰富的数据详情和自定义功能 ...
- react双向事件的绑定
双向绑定有三步,第一步,触发onChange事件,第二步,拿到input里的值,第三步,使用setState将拿到的值传回到state中. 如何拿到input里的值,可以有两种方法,第一种方法是参数e ...
- react事件绑定,事件传参,input单向数据绑定
import React, { Component } from 'react'; class New extends Component { constructor(props){ super(pr ...
- 洛谷P3389 【模板】高斯消元法
P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1,a ...
- 趣味网站5个,小鸡词典/中国配色/名著地图/海洋之音/LOGO设计
一.小鸡词典 很多流行的词语还没有收录到各大词典,却可以在小鸡词典搜索到,小鸡词典是最全的网络流行词语词典. 不少词条搞笑无厘头,撰写词条还会获得红包. 访问地址:https://jikipedia. ...
- 非阻赛IO模型
实例一: 只能在waitdata 阶段找到IO的解决方案 from concurrent.futures import ThreadPoolExecutor import socket server ...
- Google Apps的单点登录-谷歌使用的单点登录
简述: Customer :客户 Google:谷歌 Identity Provider:身份提供者安全断言标记语言(英语:Security Assertion Markup Language,简称S ...
- 线性基求第k小异或值
题目链接 题意:给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 \(T \subseteq S\), 使得集合 T 在 S 的所有非空子集的不同的异或和中, 其异或和 \(T_1 ...
- Educational Codeforces Round 54 [Rated for Div. 2] (CF1076)
第一次在宿舍打CF 把同宿舍的妹子吵得不行... 特此抱歉QAQ A 题意:给定一个字符串, 最多删掉一个字符,使得剩余字符串字典序最小 n<=2e5 当然"最多"是假的 删 ...