题目链接:http://codeforces.com/problemset/problem/399/B
题目意思:给出 n 个只由 R 和 B 组成的字符串(由上到下排列,相当于栈),问最多可以操作多少轮。一轮包括三个步骤:(1)如果栈顶的球为 red,则弹出(注意可以弹出多个),直到遇到栈顶的球为blue (2)将这个blue球替换为red球(只操作一次) (3)在替换完red 球上面添加blue球,直到有 n 个球为止。当然一轮中不一定3个步骤都执行。当 n 个球都为red时,就不能再操作了。
千万不要直接模拟,会超时的!!!观察可以发现,它实质是考我们位运算!red球代表该位的数为0,blue则代表该位为1。那么只需要对输入的那个字符串,算出二进制数转换成十进制是多少,就是答案了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 typedef long long LL; 8 const int maxn = 50 + 5; 9 char s[maxn]; 10 LL ans; 11 12 int main() 13 { 14 int n; 15 while (scanf("%d", &n) != EOF) 16 { 17 getchar(); 18 gets(s); 19 ans = 0; 20 for (int i = 0; i < n; i++) 21 { 22 if (s[i] == 'B') 23 ans += (1LL << i); 24 } 25 printf("%lld ", ans); 26 } 27 return 0; 28 }