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; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号