码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-02-21 17:10:31      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

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

给你一个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\n",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\n",ans);
48                 break;
49             }
50         }
51     }
52 }

 

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

标签:

原文地址:http://www.cnblogs.com/helica/p/5205173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!