UESTC1013-我的魔法栈-模拟/排列组合

有一个串,有黑色和白色两种元素。一次操作可以把最上面的白色元素变成黑色,同时把这个元素上面的所有元素变成白色。

给你一个30以内的串,计算变成全黑时,元素变化的总和。

我用的方法比较笨,打表处理了1-30个全白串变黑的ans,然后模拟,借助打表的结果计算出答案。

其实,每出现一个白色元素 cnt+=(1<<i+1)-1即可;

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 int T,N;
 8 char str[100];
 9 int flag;
10 long long ans;
11 int table[35] = {0,1,4,11,26,57,120,247,502,1013,2036,4083,8178,16369,32752,65519,131054,262125,524268,1048555,2097130,4194281,8388584
12                     ,16777191,33554406,67108837,134217700,268435427,536870882,1073741793,2147483616};
13 int main()
14 {
15     scanf("%d",&T);
16     while(T--)
17     {
18         scanf("%d%s",&N,str);
19         ans = 0;
20         while(true)
21         {
22             flag = 0;
23             //printf("str:%s
",str);
24             for(int i=0;i<N;i++)
25             {
26                 if(str[i]=='W')
27                 {
28                     for(int j=0;j<i;j++)
29                     {
30                         if(str[j] == 'B')
31                             ans++;
32                         else if(str[j] == 'W')
33                             str[j] == 'B';
34                     }
35                     ans += table[i];
36 
37                     str[i] = 'B';
38                     ans++;
39 
40                     flag = 1;
41                     break;
42                 }
43             }
44 
45             if(!flag)
46             {
47                 printf("%lld
",ans);
48                 break;
49             }
50         }
51     }
52 }
原文地址:https://www.cnblogs.com/helica/p/5205173.html