把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

CF399B Red and Blue Balls

题面传送门
这道题......真的无语了。
一眼看上去这道题似乎可以状压\(dp\),只有\(L\)\(R\)两种,然后我手算把样例转成了二进制,准备推转移方程,结果惊奇的发现\(RBR=(101)_2=2\),这不就是样例的答案吗?接着推了第二个样例的答案,居然也对了。
言归正传,那么我们设\(f_i\)为把\(i\)以及其上面的全部翻转为红色的步骤数,那么显然,如果\(a_i=B\),那么在翻\(a_i\)之前一定他前面的都是\(R\),那么之后的第一步一定是将所有的\(a_i\)上面的拿走,把\(a_i\)变色,把\(a_i\)上面全部填充成\(B\),根据定义,很容易得到递推式\(f_i=(\sum\limits_{j=1}^{i-1}f_j)+1\),再根据\(f_{i-1}\)的定义,很容易得到递推式优化\(f_i=2\times f_{i-1}\),边界条件为\(f_1=1\)这很显然,所以我们直接可以用\(<<\)运算符解决这个问题。
代码实现:

#include<cstdio>
using namespace std;
long long ans,tot,pus,n;
char s;
int main(){
	register int i;
	scanf("%lld",&n);
	for(i=1;i<=n;i++){
		s=getchar();
		while(s<'A'||s>'Z') s=getchar();
		if(s=='B') ans+=1ll<<(i-1);
	}
	printf("%lld\n",ans);
}
posted @ 2020-04-01 21:11  275307894a  阅读(51)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end