【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=4649

【Description】



给你一个由位运算“与”“或”“和”组成的计算表达式;

每个运算符都有p[i]的几率消失;

问你最后这个计算表达式的值的期望是多少?

运算的数字< 220

【Solution】



因为二进制在进行位运算的时候,是不会产生进位的;

因此,我们可以一位一位地算;

即从二进制的第一位开始算,通过一个简单的DP,得到

这一位在n个数字做完之后为1的概率是多少;

然后乘上2^0即可;

对于第二位,第三位…用同样的方法做即可;

定义的状态为

f[i][j][k]表示第i位,在前j个数算完之后,为k的概率是多少,k=0或者1;



【NumberOf WA】



0



【Reviw】



二进制在计算的时候,不会产生进位->各个位的计算是独立的;

这里利用了一个独立的思想;



【Code】

#include <bits/stdc++.h>
using namespace std;
#define int long long
using namespace std; const int M = 20;
const int N = 200; double f[M+10][N+10][2],p[N+10],ans = 0;
int two[M+10],n,a[N+10];
char s[N+10][5]; main(){
//freopen("/home/ccy/rush.txt","r",stdin);
two[0] = 1;
for (int i = 1;i <= M;i++)
two[i] = two[i-1]*2;
int kk = 0;
while(~scanf("%lld",&n)){
ans = 0;
for (int i = 1;i <= n+1;i++)
scanf("%lld",&a[i]);
for (int i = 1;i <= n;i++)
scanf("%s",s[i]);
for (int i = 1;i <= n;i++)
scanf("%lf",&p[i]);
for (int i = 0;i <= M-1;i++){
int temp = two[i];
if (a[1]&temp)
f[i][1][1] = 1,f[i][1][0] = 0;
else
f[i][1][0] = 1,f[i][1][1] = 0;
for (int j = 1;j <= n;j++){
if (a[j+1]&temp){
if (s[j][0]=='&'){
f[i][j+1][1] = f[i][j][1];
f[i][j+1][0] = f[i][j][0];
}
if (s[j][0]=='|'){
f[i][j+1][1] = f[i][j][1] + f[i][j][0]*(1-p[j]);
f[i][j+1][0] = f[i][j][0]*p[j];
}
if (s[j][0]=='^'){
f[i][j+1][1] = f[i][j][0]*(1-p[j]) + f[i][j][1]*p[j];
f[i][j+1][0] = f[i][j][1]*(1-p[j]) + f[i][j][0]*p[j];
}
}else{
//(a[j+1]&temp)==0
//a[j+1] in i == 0
if (s[j][0]=='&'){
f[i][j+1][1] = f[i][j][1]*p[j];
f[i][j+1][0] = f[i][j][0] + f[i][j][1]*(1-p[j]);
}
if (s[j][0]=='|'){
f[i][j+1][1] = f[i][j][1];
f[i][j+1][0] = f[i][j][0];
}
if (s[j][0]=='^'){
f[i][j+1][1] = f[i][j][1];
f[i][j+1][0] = f[i][j][0];
}
}
}
ans = ans + 1.0*temp*f[i][n+1][1];
}
printf("Case %lld:\n%.6lf\n",++kk,ans);
}
return 0;
}

【hdu 4696】Professor Tian的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. iOS开发——捕获崩溃信息

    可通过注册NSUncaughtExceptionHandler捕获异常信息,将拿到的NSException细节写入Crash日志,精准的定位出错程序位置,有需要的,可直接将crash信息直接上传服务器 ...

  2. 用VUE做网站后台

    介绍: 这是一个用vuejs2.0和element搭建的后台管理界面. 相关技术: vuejs2.0:渐进式JavaScript框架,易用.灵活.高效,似乎任何规模的应用都适用. element:基于 ...

  3. 【转载】解决django models文件修改后的数据库同步问题——south模块

    转载链接:https://www.cnblogs.com/frchen/p/5732490.html 在使用django进行开发时,往往需要根据不同的需求对model进行更改.而这时候,python ...

  4. Linux学习之socket编程(一)

    socket编程 socket的概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket. 在TCP协议中,建立连接的两个进 ...

  5. 【Codeforces Round #422 (Div. 2) C】Hacker, pack your bags!(二分写法)

    [题目链接]:http://codeforces.com/contest/822/problem/C [题意] 有n个旅行计划, 每个旅行计划以开始日期li,结束日期ri,以及花费金钱costi描述; ...

  6. MyBatis学习总结(17)——Mybatis分页插件PageHelper

    如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示. 想要使用分页插件?请看如何使用分页插件. 物理分页 该 ...

  7. Myeclipse学习总结(4)——Eclipse常用开发插件

    (1)    AmaterasUML         介绍:Eclipse的UML插件,支持UML活动图,class图,sequence图,usecase图等:支持与Java class/interf ...

  8. 【Android进阶】Junit单元測试环境搭建以及简单有用

    单元測试的目的 首先.Junit单元測试要实现的功能,就是用来測试写好的方法是否可以正确的运行,一般多用于对业务方法的測试. 单元測试的环境配置 1.在AndroidManifest清单文件的Appl ...

  9. 当我们谈论Erlang Maps时,我们谈论什么 Part 1

         Erlang 添加 Maps数据类型并非非常突然,由于这个提议已经进行了2~3年之久,仅仅只是Joe Armstrong老爷子近期一篇文章Big changes to Erlang掀起不小了 ...

  10. Error 0x80070020 when you try to start a Web site in IIS 7.0

    https://support.microsoft.com/en-hk/help/973094/error-0x80070020-when-you-try-to-start-a-web-site-in ...