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})\)


  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <bitset>
  7. using std::bitset;
  8. const int maxn=101000;
  9. const int MAX=100000;
  10. const long long mod=1000000001;
  11. const int log_2=17;
  12. const int log_3=11;
  13. int n;
  14. long long map[log_2][300];
  15. int check[log_2][log_3];
  16. int Log_2,Log_3;
  17. int len[log_2];
  18. int step[maxn],tot;
  19. bitset<maxn>vis;
  20. void init()
  21. {
  22. for(int i=0;i<(1<<log_3);i++)
  23. if((i&(i<<1))==0)
  24. step[++tot]=i;
  25. return ;
  26. }
  27. double Log(int base,int val)
  28. {
  29. return log(val)/log(base);
  30. }
  31. long long calc(int limte)
  32. {
  33. memset(map,0,sizeof(map));
  34. memset(check,0,sizeof(check));
  35. memset(len,0,sizeof(len));
  36. int wide=0;
  37. for(int &i=wide,pas1=limte;i<=Log_2&&pas1<=n;i++,pas1<<=1)
  38. for(int j=0,pas2=pas1;j<=Log_3&&pas2<=n;j++,pas2*=3)
  39. {
  40. check[i][j]=pas2,len[i]|=(1<<j);
  41. vis[pas2]=1;
  42. }
  43. wide-=1;
  44. for(int i=1;step[i]<=len[0]&&i<=tot;i++)
  45. map[0][i]=1;
  46. for(int i=0;i<wide;i++)
  47. for(int j=1;step[j]<=len[i]&&j<=tot;j++)
  48. for(int k=1;step[k]<=len[i+1]&&k<=tot;k++)
  49. if((step[j]&step[k])==0)
  50. map[i+1][k]=(map[i][j]+map[i+1][k])%mod;
  51. long long ans=0;
  52. for(int i=0;step[i]<=len[wide];i++)
  53. ans=(ans+map[wide][i])%mod;
  54. return ans;
  55. }
  56. int main()
  57. {
  58. init();
  59. scanf("%d",&n);
  60. Log_2=Log(2,n);Log_3=Log(3,n);
  61. long long ans=1;
  62. for(int i=1;i<=n;i++)
  63. if(!vis[i])
  64. ans=(ans*calc(i))%mod;
  65. printf("%lld",ans);
  66. }

Luogu_3239 [HNOI2015]亚瑟王的更多相关文章

  1. 【BZOJ4008】[HNOI2015]亚瑟王 期望

    [BZOJ4008][HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最 ...

  2. BZOJ 4008: [HNOI2015]亚瑟王( dp )

    dp(i, j)表示考虑了前i张牌, 然后还有j轮的概率. 考虑第i+1张牌: 发动的概率 : p = dp(i, j) * (1 - (1-p[i+1])^j) 没发动的概率 : dp(i, j) ...

  3. 【BZOJ4008】[HNOI2015]亚瑟王(动态规划)

    [BZOJ4008][HNOI2015]亚瑟王(动态规划) 题面 BZOJ 洛谷 题解 设\(f[i][j]\)表示前\(i\)张卡中有\(j\)张被触发的概率. 分两种情况转移,即当前这张是否被触发 ...

  4. [洛谷 P3239] [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...

  5. 4008: [HNOI2015]亚瑟王

    4008: [HNOI2015]亚瑟王 链接 分析: 根据期望的线性性,直接求出每张牌出现的概率,最后乘以攻击力就是答案. 每张牌出现的概率只与它前面的牌有关,与后面的没有关系,于是按顺序考虑每张牌. ...

  6. 【BZOJ4008】[HNOI2015]亚瑟王

    [BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...

  7. bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望

    [bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...

  8. 概率DP——BZOJ4008 [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...

  9. Bzoj4008 [HNOI2015]亚瑟王

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 1009  Solved: 605[Submit][Status] ...

随机推荐

  1. bnu 4060 奇偶性,异或运算

    Plants vs. Zombies Time Limit: 5000ms Memory Limit: 2048KB   64-bit integer IO format: %lld      Jav ...

  2. VS2012 常用配置

    一. 整合svn版本控制 1. 点击此 下载与SVN版本相对应的ankhsvn插件,本人用的是Subversion 1.8 2. 安装ankhsvn插件,打开VS2012,右键任一工程,有显示如下图, ...

  3. C#学习笔记-接口与抽象类

    namespace ClassLesson { class Program { static void Main(string[] args) { ); Console.WriteLine(perso ...

  4. thinkphp点击导航变色

    1.从该处进入导航页面,点击分贝进入点击的页面. 2.点击1处进入对应的导航栏,导航栏变色. 3.在1图图片点击跳转是给地址添加参数status. 4.在后台IndexController.class ...

  5. python学习之老男孩python全栈第九期_day022作业

    1. 写一个求正方形周长和面积的类 class Square: def __init__(self, length): self.length = length def area(self): ret ...

  6. line-height和height的区别

    line-height 是指每行的高度, 假如定义p标签的行高为line-heigth:20px; 文字在浏览器中显示为一行时,这个p标签的高度会为20px,如果为两行,则p标签的高度为40px; l ...

  7. Java 之集合框架 中(10)

    Map和HashMap Map接口: Map 提供了一种映射关系,其中的元素是以键值对(Key-Value)的形式 存储的,能够实现根据Key快速查找value Map中的键值对以Entry类型的对象 ...

  8. C++多线程编程(教程+Demo)

    下载地址:C++多线程编程(教程+Demo) Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步.互斥和临界区等操作.Visual C++ 6.0中,使用MFC类库也实现 ...

  9. Navicat 连接 Oracle数据库并,导入数据泵(.dmp)

    如有什么质疑的地方,希望可以和大家一起探讨,共同进步. 一.安装方法: 1.首先下载Navicat Premium和Oracle Database Oracle Database官网下载地址:http ...

  10. RHEL生命周期管理 -- Should I stay, or should I go?

    1. RHEL的支持策略是怎么样的? 标准支持(一般7年)+ 延长支持(3年) 2. 升级RHEL的好处有哪些? More advantageous to upgrade completely to ...