Codeforces 399B - Red and Blue Balls
Posted xFANx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 399B - Red and Blue Balls相关的知识,希望对你有一定的参考价值。
题意:你有一个栈,栈有n个球,球有蓝红色。定义
1.当栈顶为红球时,不断移除栈顶元素
2.将栈顶的蓝球更换为红球
3.向栈里填充蓝球只至栈有n个球
为一次操作
问在第几次操作的过程中,栈内全部为红球
我们定义栈顶为第零层。在游戏为结束之前,我们必定能找到一个蓝色的球,满足其比其小的层次全为红球。定义将第i层及其上方所有球变为红色需要的操作次数为F(i)
F(0)=1;
F(1)=1+F(0)=2;//1代表第一次操作,结果是将i层变为红球,0~i-1层全变为蓝色球
F(2)=1+F(0)+F(1)=4;
F(3)=1+F(0)+F(1)+F(2)=8;
我们可以发现F(i)等同于2^i。
原因嘛...红球相当于二进制中的1,蓝球相当于0。蓝球(0)上层都是红球(1),那么只需1即可进位,进位后补零。题意求的就是给定状态对应的大小与2^n的差值
很多有二元表示外加一顿奇怪的操作或复杂的模拟的题目,无论是用球,状态,数字,都应该联想到二进制表示。特别是如这种题目中1<=n<=50这么小的情况
1 #include <cstdio> 2 using namespace std; 3 typedef long long LL; 4 5 int n; 6 LL ans = 0; 7 8 int main(int argc, const char * argv[]) { 9 scanf("%d", &n); 10 getchar(); 11 for (int i = 0; i <= n - 1; i++) { 12 if (getchar() == ‘B‘) ans |= ((LL)1 << i); //注意这里的类型转化QAQ 13 } 14 printf("%lld\n", ans); 15 return 0; 16 }
以上是关于Codeforces 399B - Red and Blue Balls的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 1519A Red and Blue Beans
[CodeForces-375E]Red and Black Tree
Codeforces 1106ELunar New Year and Red Envelopes
Educational Codeforces Round 108 (Rated for Div. 2)-A. Red and Blue Beans-题解