注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

n+e

NewWeb:http://trinkle.is-programmer.com/

 
 
 

日志

 
 

[BZOJ3150][Ctsc2013]猴子  

2015-06-20 16:10:28|  分类: BZOJ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3150: [Ctsc2013]猴子

Time Limit: 20 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 94  Solved: 58
[Submit][Status][Discuss]

Description

小Q和小M最近发明了一种卡牌游戏,叫猴子大战。
游戏最初小Q和小M各会取得一部分猴子牌。每局游戏,他们两个需要分别等概率地从自己的猴子牌中抽取一张进行战斗。获胜的一方将获得双方的猴子牌。如果一方获得了所有的猴子牌,则该方获得整场游戏的胜利。否则游戏将一直进行下去。 在进行了若干场比赛以后,小Q和小M算出了一张胜率表,为每张猴子牌之间进行战
斗双方获胜的概率。由于每场战斗一定会决出胜负,而且胜率不受先后顺序的影响,因此对于任意的两张猴子牌A和B,A战胜B的概率加B战胜A的概率为1。 由于自己老是输给小M,小Q开始怀疑自己每次拿到的猴子牌是否能获得胜利。他希望求出自己拿到的每种猴子牌组合的获胜的概率。 由于小Q接下来还有在CD市体育中心数以万计的运动计划,因此这个问题只能交给你来解决了。

Input

输入的第一行包含两个正整数n和m,表示猴子牌的总张数和需要求的猴子牌组合的个数。 接下来有n行,每行包含n个实数,每个实数保留了两位小数。这n行中,其中第i行第j列的数为Pi,j,表示第i张猴子牌战胜第j张猴子牌的概率。保证Pi,j + Pj,i  =  1。特别地,Pi,j = 0.5,没有特殊意义。 最后又m行。每行包含一个长度为n的无空格分隔的01串,表示一个猴子牌的组合。其中第i个字符如果为0,表示最初第i张牌在小M处,否则表示在小Q处。

Output

输出m行,每行一个实数,四舍五入保留八位小数(请强制输出八位浮点数),一次表示每个给定的猴子牌组合下小Q获胜的概率。

Sample Input

3 4 0.50 0.60 0.40 0.40 0.50 0.70 0.60 0.30 0.50 110 011 111 000

Sample Output

0.71304348 0.66086957 1.00000000 0.00000000

HINT

【评分方法】 
你的答案的每一行如果与我们给定的参考答案的差别均不超过2×10-6,则获得该测试点的得分,否则不得分。 参考答案保证与真实值的差别不超过10-8,因此如果你输出的答案保证与真实值差别不超过2×10-6 — 2×10-8,才能保证正确。

Source

Solution

容易发现每张牌对答案的贡献独立。所以列一个n元一次方程,高斯消元即可

Code

/**************************************************************
    Problem: 3150
    User: wjy1998
    Language: C++
    Result: Accepted
    Time:60 ms
    Memory:900 kb
****************************************************************/
 
#include<cstdio>
typedef double ld;
ld p,f[110][110],ans,tmp,g[110];
#define swap(a,b) (tmp=a,a=b,b=tmp)
#define abs(x) (x>0?x:-(x))
int n,m,i,j,k,id;char s[110];
int main(){
    for(scanf("%d%d",&n,&m),i=1;i<n;i++)
    for(f[i][i]=1-n,j=1;j<=n;j++)
    if(scanf("%lf",&p),i!=j)f[i][j]=p,f[i][i]+=p;
    for(i=1;i<=n;i++)scanf("%lf",&p),f[n][i]=1;f[n][n+1]=1;
     
    for(i=1;i<=n;i++){
        for(id=i,j=i+1;j<=n;j++)
        if(abs(f[j][i])>abs(f[id][i]))id=j;
        if(id!=i)for(k=i;k<=n+1;k++)swap(f[i][k],f[id][k]);
        for(j=i+1;j<=n;j++)
        for(tmp=f[j][i]/f[i][i],k=i;k<=n+1;k++)f[j][k]-=tmp*f[i][k];
    }
    for(i=n;i;i--)
    for(g[i]=f[i][n+1]/f[i][i],j=1;j<i;j++)f[j][n+1]-=g[i]*f[j][i];
     
    for(;m--;printf("%.8lf\n",ans))
    for(scanf("%s",s+1),ans=0,i=1;i<=n;i++)if(s[i]=='1')ans+=g[i];
}
  评论这张
 
阅读(43)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018