返回顶部

Codeforces Round #272 (Div. 2) B. Dreamoon and WiFi (暴力二进制枚举)

  • 题意:给你一个只含\(+\)\(-\)的字符串,统计它的加减和,然后再给你一个包含\(+,-,?\)的字符串,其中\(?\)可以表示为\(+\)\(-\),问有多少种情况使得第二个字符串的加减和等于第一个.

  • 题解:首先我们统计第一个字符串的和,然后统计第二个字符串的加减和以及\(?\)的个数,然后对于\(?\)我们进行二进制枚举,枚举它的所有可能情况的和,再加上第二个字符串的和每次判断一下是否和第一个相等即可.

  • 代码:

    char s[N],t[N];
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        scanf("%s",s);
        getchar();
        scanf("%s",t);
        double res=0;
        for(int i=0;i<strlen(s);++i){
        	if(s[i]=='+') res++;
        	else res--;
        }
        double cnt=0;
        double ans=0;
        double sum=0;
        for(int i=0;i<strlen(t);++i){
        	if(t[i]=='+') cnt++;
        	else if(t[i]=='-') cnt--;
        	else{
        		sum++;
        	}
        }
        if(sum==0){
        	if(cnt==res) printf("1.000000000\n");
        	else printf("0.000000000\n");
        	return 0;
        }
        for(int i=1;i<=(1<<(int)sum);++i){
        	int tmp=0;
        	for(int j=0;j<sum;++j){
        		if(i&(1<<j)) tmp++;
        		else tmp--;
        	}
        	if(cnt+tmp==res) ans++;
        }
        sum=pow(2,sum);
       printf("%.9f\n",ans/sum);
     
        return 0;
    }
    
posted @ 2020-10-09 18:45  _Kolibri  阅读(134)  评论(0)    收藏  举报