洛谷 P2111 考场奇遇

题目背景

本市的某神校里有一个学霸,他的名字叫小明(为了保护主人公的隐私,他的名字都用“小明”代替)。在这次的期中考试中,小明同学走桃花运,在考场上认识了一位女生,她的名字叫小红(同样是为了保护隐私)。

题目描述

英语考试结束了,打完铃,她就主动来找小明说话,一来就要借英语卷子对答案。小明是公认的英语大神,二话不说就把卷子借给了她。小红对了一遍答案,简直是千差万别,她不禁冒出了冷汗。这时,小明走过来,安慰她:“没事,我又不是标准答案,不一定全对。”

已知小明答案的准确率是A%,一共有N道题,给出小红对答案的结果S(一个长为N的01串,其中1表示两人答案一样,0表示不一样)。为了简化问题,所有题目都是判断题。

请你帮小红写一个程序,计算出她对Q题及以上的概率。

(P.S.小明后来把那张卷子送给了小红,别想多了,不是定情信物)

输入输出格式

输入格式:

 

第1行,三个正整数N,A,Q。

第2行,一个01字符串S。

 

输出格式:

 

一行,一个实数,表示她对Q题及以上的概率。(保留3位小数)

 

输入输出样例

输入样例#1: 复制
3 90 2
100
输出样例#1: 复制
0.172

说明

对于90%数据,N<=50,N-5<=Q<=N。

对于剩下的10%数据,N<=10000,Q=0.

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch;
double p,ans;
int n,q,nd,nc,cd[6],cc[6];
double fastpower(double a,int b){
    double s=1;
    for(;b;b>>=1){
        if(b&1)    s*=a;
        a*=a;
    }
    return s;
}
int main(){
    scanf("%d%lf%d\n",&n,&p,&q);
    if(n<=50){
        q=n-q;
        while((ch=getchar())!='0'&&ch!='1') ch=getchar();
        while(ch=='0'||ch=='1'){            
            if(ch=='1')    nd++;
            if(ch=='0')    nc++;
            ch=getchar(); 
        }
        cd[0]=1;cd[1]=nd;cd[2]=cd[1]*(nd-1)/2;
        cd[3]=cd[2]*(nd-2)/3;cd[4]=cd[3]*(nd-3)/4;cd[5]=cd[4]*(nd-4)/5;
        cc[0]=1;cc[1]=nc;cc[2]=cc[1]*(nc-1)/2;
        cc[3]=cc[2]*(nc-2)/3;cc[4]=cc[3]*(nc-3)/4;cc[5]=cc[4]*(nc-4)/5;
        for(int i=0;i<=q;i++)
            for(int j=0;j<=min(i,nc);j++){
                if(i-j>nd)    continue;
                ans+=cc[j]*fastpower(p*0.01,j)*cd[i-j]*fastpower((1-p*0.01),i-j)*fastpower(1-p*0.01,nc-j)*fastpower(p*0.01,nd-i+j); 
            }
        printf("%.3lf",ans);
    }
    else{
        printf("1.000");
        return 0;
    }
}

 

posted @ 2018-02-04 09:41  一蓑烟雨任生平  阅读(238)  评论(0编辑  收藏  举报