题目

CF399B

洛谷RemoteJudge

思路

很容易发现,栈中靠上的蓝色球的出栈,对它下方的蓝色球没有影响.

举个例子:

第一步中靠上的蓝色球第三步出栈了,这一过程对它下面的蓝色球(即第一步中靠下的蓝色球)没有产生影响.

这启示我们由上到下分别计算每一颗(初始状态下的)蓝色球出栈需要的步数,再相加得到答案.

不妨设\(f(x)\)表示离栈顶距离为\(x\)的蓝色球出栈需要的步数,那么上面的样例的答案即为\(f(2)+f(3)\),即"离栈顶距离为\(2\)的蓝色球出栈所需步数\(+\)离栈顶距离为\(3\)的蓝色球出栈所需步数".

接下来的问题就是求\(f(x)\)函数的值.

显然\(f(1)=1\),即如果该球在栈顶,出栈需要\(1\)步操作.

考虑更一般的情况,我们会发现一个蓝色球想出栈的第一步,一定是将该蓝色球所在位置变为红色球,再将上方所有红色球变为蓝色球.

例如上面例子中的\("3\rightarrow4"\)这一步,原在从顶到下第三个位置的蓝色球想出栈,第一步就是把从顶到下第三个位置变为红色球,同时把从顶到下第一/二个位置变为蓝色球.

于是可以得到递推方程:

\[f(x)=f(1)+f(2)+...+f(x-1)+1\quad(x\geq2)
\]

也就是说,从顶到下第\(x\)个位置的蓝色球想出栈,等效于先走一步变为 "\(x\)位置红,\(1...x-1\)位置蓝",再让\(1...x-1\)位置的蓝色球依次出栈.

由于这道题数据范围较小,我们当然可以\(O(n^2)\)计算所有\(f(x)\)的值,但我们也可以推推通项公式.

由递推式,有

\[f(i-1)=f(1)+f(2)+...+f(i-2)+1
\]

所以

\[f(i)=f(1)+f(2)+...+f(i-2)+f(i-1)+1
\]

\[f(i)=[f(1)+f(2)+...+f(i-2)+1)]+f(i-1)
\]

\[f(i)=2\times f(i-1)
\]

所以

\[f(i)=2^{i-1}
\]

所以

\[ans= \sum_{if \space s[i]==B} (2^{i-1})
\]

实际代码中,需要注意字符串的下标从\(0\)开始.

代码

#include<bits/stdc++.h>
using namespace std; int n;
long long ans,p;
string s; int main()
{
cin>>n>>s;
for(int i=0;i<s.size();i++)
{
p= i==0? 1 : p*2;
if(s[i]=='B')
ans+=p;
}
cout<<ans;
return 0;
}

CF399B Red and Blue Balls的更多相关文章

  1. AC日记——Red and Blue Balls codeforces 399b

    399B - Red and Blue Balls 思路: 惊讶的发现,所有的蓝球的消除都是独立的: 对于在栈中深度为i的蓝球消除需要2^i次操作: 代码: #include <cstdio&g ...

  2. 洛谷 CF399B【Red and Blue Balls】题解

    n年没有更博客:我总结出了规律,当学的东西很难得时候都去学习,没有时间写博客,只有 内容对于我这种蒟蒻友好,又让我非常闲的慌时才写博客,这种博客以后也没有价值(也有些是做完一道题有成就感写的) 最近内 ...

  3. codeforces 399B. Red and Blue Balls 解题报告

    题目链接:http://codeforces.com/problemset/problem/399/B 题目意思:给出 n 个只由 R 和 B 组成的字符串(由上到下排列,相当于栈),问最多可以操作多 ...

  4. Codeforces Round #233 (Div. 2) B. Red and Blue Balls

    #include <iostream> #include <string> using namespace std; int main(){ int n; cin >&g ...

  5. cf B Red and Blue Balls

    思路:把字符串转化为一个二进制,遇到B就是一个数二进制中的1,答案就是这个数. #include <cstdio> #include <cstring> #include &l ...

  6. 微软往年校招招面试题AC全解。

    因为4月初要参加微软的online.所以今天把微软的面试题拿出来做了,自己解答了题目.下面附上我的解答代码. -----------16年9月校招:  第一道题:Farthest Point(最远的整 ...

  7. hihoCoder#1135

    刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The c ...

  8. 【hihocoder】 Magic Box

    题目1 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. When ...

  9. hihocoder 1135 : Magic Box

    #1135 : Magic Box 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 The circus clown Sunny has a magic box. Whe ...

随机推荐

  1. 全栈之路-小程序API-SpringBoot项目中参数校验机制与LomBok工具集使用

    参数校验机制在web开发中是非常重要的,每当看到现在所在公司的校验代码,我都有头疼,每一个接口都是重新写参数的校验,有些复杂的接口,参数的校验甚至占了整个接口代码量的挺大一部分的,看着我都有些头疼,我 ...

  2. 图片中添加箭头【使用PPT实现】

    手头上可以使用的方案 QQ截图 分辨率会改变 画图 网上的教程一般是画一根线再加一个三角来画箭头,有点麻烦,改起来不好改. PS 对我来说,软件安装本身就是个问题, 插入图片,加入箭头,组合,另存为, ...

  3. 第2章.数组和ArrayList

    2.1 数组基本概念 数组是可索引的数据的集合.数组既可以是内置的类型,也可以是用户自定义的类型.事实上,把数组数据称为对象大概是最简便的方式.C#中数组实际上就是对象的本身,因为它们都源于Syste ...

  4. BZOJ2005: [Noi2010]能量采集(欧拉函数)

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后, 栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种 ...

  5. 深度优先搜索DFS---全球变暖

    内心OS:这道题是去年准备HD复试时,我用来练习DFS的.现在再做这道题,感触颇深,唉,时光蹉跎,物是人非啊~~ 题目: 你有一张某海域NxN像素的照片,”.”表示海洋.”#”表示陆地,如下所示: … ...

  6. python学习随笔2:python判断和循环

    1.if-else _username = 'heyue' _password = ' username = input("username:") password = input ...

  7. Redis的各个数据的类型基本命令

    什么是Redis: 概念: Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库. 特征:1. 数据间没有必然的关联 ...

  8. java Graphics2D绘制文字 本地正常服务器乱码问题

    先贴关键代码: 用Graphics2D画文字到图片,再生成图片文件,在本地运行正常,一部署到服务器就不正常,变成了正方框如下图 解决问题思路: 1.部署服务器的编码问题. 2.代码问题. 以上两点一直 ...

  9. javaSE学习笔记(10)---List、Set

    javaSE学习笔记(10)---List.Set 1.数据存储的数据结构 常见的数据结构 数据存储的常用结构有:栈.队列.数组.链表和红黑树. 1.栈 栈:stack,又称堆栈,它是运算受限的线性表 ...

  10. How Many Answers Are Wrong HDU - 3038 带边权并查集

    #include<iostream> #include<cstring> using namespace std; ; int d[N],p[N]; int find(int ...