HDU 4649 多校第五场1007
2013-08-06 20:12
295 查看
虽然这次做了5题,但是居然还是有板刷题没过掉。。
又是这节奏。。
贴一下这道板刷题。。
思路:每个数取他的二进制位,对于每一位,我们求他最后出现1的概率,那么最后的期望就是为1的概率乘以该位的十进制数,累加即可。
想到状压就是水题。。。
又是这节奏。。
贴一下这道板刷题。。
思路:每个数取他的二进制位,对于每一位,我们求他最后出现1的概率,那么最后的期望就是为1的概率乘以该位的十进制数,累加即可。
想到状压就是水题。。。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 2505 #define inf 0x7fffffff #define LL(x) ( x << 1 ) #define RR(x) ( x << 1 | 1 ) #define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i ) #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define mp(a,b) make_pair(a,b) #define PII pair<int,int> #define bug puts("here") using namespace std; #define N 222 double dp[22] [2] ;//第i位第j个数是k的概率。 int a ; char b ; double p ; int n ; int main() { int ca = 0 ; while(cin >> n){ for (int i = 0 ; i <= n ; i ++ ){ scanf("%d",&a[i]) ; } for (int i = 1 ; i <= n ; i ++ ){ cin >> b[i] ; } for (int i = 1 ; i <= n ; i ++ ){ cin >> p[i] ; } for (int i = 0 ; i <= n ; i ++ ){ for (int j = 0 ; j <= 20 ; j++ ){ for (int k = 0 ;k < 2 ; k ++ ) dp[j][i][k] = 0 ; } } double ans = 0 ; for (int i = 0 ; i <= 20 ; i ++ ){ if(a[0] & (1 << i)) dp[i][0][1] = 1 ; else dp[i][0][0] = 1 ; for (int j = 1 ; j <= n ; j ++ ){ dp[i][j][1] = dp[i][j - 1][1] * p[j] ;//该位不取 dp[i][j][0] = dp[i][j - 1][0] * p[j] ;//该位不取 if(a[j] & (1 << i)){//取该位 if(b[j] == '&'){ dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; } else if(b[j] == '|'){ dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][1] += dp[i][j - 1][0] * (1 - p[j]) ; } else { dp[i][j][1] += dp[i][j - 1][0] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][1] * (1 - p[j]) ; } } else {//同理 if(b[j] == '&'){ dp[i][j][0] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; } else if(b[j] == '|'){ dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; } else { dp[i][j][0] += dp[i][j - 1][0] * (1 - p[j]) ; dp[i][j][1] += dp[i][j - 1][1] * (1 - p[j]) ; } } } ans += (1 << i) * dp[i] [1] ; } printf("Case %d:\n%.6f\n",++ca ,ans) ; } return 0 ; }
相关文章推荐
- hdu 4649 Professor Tian 多校第五场
- HDU 4649 Professor Tian (2013多校联合5 1007)
- 2013 多校第五场 hdu 4649 Professor Tian
- hdu 5349 MZL's simple problem (2015多校第五场第7题) multiset
- hdu 5791 two 多校联赛第五场
- HDU 4638 Group (2013多校4 1007 离线处理+树状数组)
- HDU 4638 多校四-1007
- hdu 4911 Inversion 多校第五场 求逆序数
- HDU-2017 多校训练赛6-1007-GCDispower
- 2017 多校训练第五场 HDU 6085
- hdu 5347 MZL's chemistry(2015多校第五场第5题)高中化学选修知识 第一电离能
- hdu 4649 Professor Tian 多校联合训练的题
- Hdu 5347 MZL's chemistry 2015ACM多校对抗赛第五场
- hdu 4649 Professor Tian 多校联合训练的题
- HDU-2017 多校训练赛4-1007-Matching In Multiplication
- 2013 多校第五场 hdu 4651 Partition
- 2013 多校第五场 hdu 4647 Another Graph Game
- hdu5790 Prefix(2016多校第五场1009)trie+主席树
- 2017 多校训练第五场 HDU 6092 Rikka with Subset
- HDU 5351 MZL's Border(2015多校第五场第9题) 写长串找规律