Luogu_3239 [HNOI2015]亚瑟王
Luogu_3239 [HNOI2015]亚瑟王
vim-markdown 真好用
这个题难了我一下午
第一道概率正而八经\(DP\),还是通过qbxt讲解才会做的。
发现Sengxian真是个dalao。讲的真是很清楚。代码也比较干净
做题心得:
1.概率和期望联系紧密。若无法直接计算期望,可是用期望的性质,将问题转化为算概率
2.若目标概率无法直接计算,可以通过计算过程中的某个步骤的概率,间接的计算出目标概率
若跟据局面进行状压\(DP\),时间复杂度成熟不起。
考虑优化状态。
发现,对于某一张牌,我们只要知道他用没有用过就行了。
所以一个很重要的操作就是定序。
我们只需要枚举某一张牌。在某一个局面中是否会被选中就可以了。
根据某一个局面出现的概率,便可计算出某一张牌在某个局面被选的概率,从而推出期望。
那么问题就是推出这个局面出现的概率。也就是过程中某个步骤的概率。
我们可以更改一下决策, 我们只需要枚举在某一个局面中。要么在剩余j轮(也就是当前局面)的时候被选中,要么在永远不会被选中
然后直接转移到决策下一张卡。
这样做, 我们可以避免同一张卡之间不同决策之间的互相影响, 又可以不丢失任何答案。
设\(f_{i,j}\)为前\(i\)张卡牌已经决策完了,还剩下\(j\)局可以进行
根据上面的说明,便可以写出状态转移方程
\(f_{i,j}=f_{i-1,j}*(1-p_i)^j+f_{i-1,j+1}*(1-(1-p_i)^{j+1})\)
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <bitset>
using std::bitset;
const int maxn=101000;
const int MAX=100000;
const long long mod=1000000001;
const int log_2=17;
const int log_3=11;
int n;
long long map[log_2][300];
int check[log_2][log_3];
int Log_2,Log_3;
int len[log_2];
int step[maxn],tot;
bitset<maxn>vis;
void init()
{
for(int i=0;i<(1<<log_3);i++)
if((i&(i<<1))==0)
step[++tot]=i;
return ;
}
double Log(int base,int val)
{
return log(val)/log(base);
}
long long calc(int limte)
{
memset(map,0,sizeof(map));
memset(check,0,sizeof(check));
memset(len,0,sizeof(len));
int wide=0;
for(int &i=wide,pas1=limte;i<=Log_2&&pas1<=n;i++,pas1<<=1)
for(int j=0,pas2=pas1;j<=Log_3&&pas2<=n;j++,pas2*=3)
{
check[i][j]=pas2,len[i]|=(1<<j);
vis[pas2]=1;
}
wide-=1;
for(int i=1;step[i]<=len[0]&&i<=tot;i++)
map[0][i]=1;
for(int i=0;i<wide;i++)
for(int j=1;step[j]<=len[i]&&j<=tot;j++)
for(int k=1;step[k]<=len[i+1]&&k<=tot;k++)
if((step[j]&step[k])==0)
map[i+1][k]=(map[i][j]+map[i+1][k])%mod;
long long ans=0;
for(int i=0;step[i]<=len[wide];i++)
ans=(ans+map[wide][i])%mod;
return ans;
}
int main()
{
init();
scanf("%d",&n);
Log_2=Log(2,n);Log_3=Log(3,n);
long long ans=1;
for(int i=1;i<=n;i++)
if(!vis[i])
ans=(ans*calc(i))%mod;
printf("%lld",ans);
}
Luogu_3239 [HNOI2015]亚瑟王的更多相关文章
- 【BZOJ4008】[HNOI2015]亚瑟王 期望
[BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...
- BZOJ 4008: [HNOI2015]亚瑟王( dp )
dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...
- 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)
[BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- 4008: [HNOI2015]亚瑟王
4008: [HNOI2015]亚瑟王 链接 分析: 根据期望的线性性,直接求出每张牌出现的概率,最后乘以攻击力就是答案. 每张牌出现的概率只与它前面的牌有关,与后面的没有关系,于是按顺序考虑每张牌. ...
- 【BZOJ4008】[HNOI2015]亚瑟王
[BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...
- bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望
[bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...
- 概率DP——BZOJ4008 [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...
- Bzoj4008 [HNOI2015]亚瑟王
Time Limit: 20 Sec Memory Limit: 512 MBSec Special Judge Submit: 1009 Solved: 605[Submit][Status] ...
随机推荐
- Gradle修改缓存路径 和 Gradle修改Maven仓库地址
Gradle修改缓存路径 修改gradle启动脚本进入gradle安装的bin目录,使用文本编辑器打开gradle.bat文件,在如图的位置添加以下语句 set GRADLE_OPTS="- ...
- Algorithm——整数反转
一.问题 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 12 ...
- Java 学习笔记(2)——基本语句、控制结构
上一篇中简单谈了一下自己对Java的一些看法并起了一个头,现在继续总结java的相关语法.java语法总体上与C/C++一样,所以对于一个C/C++程序员来说,天生就能看懂Java代码.在学习java ...
- Oracle 计算两个日期间隔的天数、月数和年数
在Oracle中计算两个日期间隔的天数.月数和年数: 一.天数: 在Oracle中,两个日期直接相减,便可以得到天数: select to_date('08/06/2015','mm/dd/yyyy' ...
- 微信小程序开发7-JavaScript脚本
1.小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来完成业务需求. 2.ECMAScript 在大部分开发者看来,ECMAS ...
- 用jsp实现网站登录界面的制作,并连接数据库
课堂测试 任务需求: 撰写一篇博客 需要网站系统开发需要掌握的技术: 本次课堂测试的源程序代码: 运行结果截图: 说明课堂测试未按时完成的原因. 列出你对这门课的希望和自己的目标,并具体列出你计划每周 ...
- Ubuntu18.04 vmware环境下配置静态ip
各种linux系统发行版本配置静态ip方法各不相同,dhcp获取的话ip可能会变动,如果用xshell等工具连接的时候还要改ip,很是麻烦: 参考了网上各种配置Ubuntu18.04配置静态ip的方法 ...
- Oracle与EntityFramework(EF)的一些事情
概要 Oracle 和EF 一起用的时候总会有各种问题,这里总结一下解决办法. 模式 Schema 用过Oracle的人应该知道,其实Oracle的用户名一般就是它的模式名称,如果你在用databas ...
- unity3d项目版本管理设置
unity3d老是有一堆乱七八糟的文件,好像不提交也不行,特别是那烦人的meta文件,哪到底unity项目提交到版本管理哪些东西可以忽略呢?应该设置些什么东西呢? 菜单,Edit => Proj ...
- 深入剖析php执行原理(4):函数的调用
本章开始研究php中函数的调用和执行,先来看函数调用语句是如何被编译的. 我们前面的章节弄明白了函数体会被编译生成哪些zend_op指令,本章会研究函数调用语句会生成哪些zend_op指,等后面的章节 ...