题目

题目描述:

众所周知的是Dr.Bai 穷困潦倒负债累累,最近还因邦邦的出现被班上的男孩子们几乎
打入冷宫,所以Dr.Bai 决定去打工赚钱。

Dr.Bai 决定做玩♂球的工作,工作内容如下。

老板提供一根圆筒,里面随意的放着n 个球
仅有粉红色和蓝色。

因为老板喜欢粉红色,于是他要求Dr.Bai进行操作使得筒内只有粉红色球,而操作也有规定,将一下三个步骤算作一次操作:

  1. 将顶端的粉色球弹出,直到是蓝色球。

  2. 然后把第一个蓝色球变成可爱的粉红色。

  3. 向筒里面扔蓝色球,直到球的数量又是优美的n。

然而斤斤计较精打细算的Dr.Bai 想要知道他最少多少次操作使得任务完成,这样的话
Dr.Bai 就能去摸鱼了

可是Dr.Bai 心里只有更高更妙的物理,所以Dr.Bai 请你来帮他计算次数。

输入格式

输入为两行,第一行为一个正整数n(代表球的数量)

第二行为长为n 仅由BP 组成的字符串。

输出格式

输出仅一行,为一个正整数m(代表最少使得筒内仅有粉红色球的操作数)

样例

输入

4
PBBP

输出

6

数据范围

对于20%的数据:1<=N<=10

对于30%的数据:1<=N<=20

对于100%的数据:1<=N<63


思路

部分分

很明显的就是纯模拟,也比较好打,时间复杂度是 O(2n)

正解

将状态二进制化后……我们就能找规律了。

  • 其实好像叫做模拟计数问题,但是我觉得就是找规律
    在自栈顶向下的第 k 个位置上的蓝球变为粉球的代价是 2k-1次。
    对于整体的栈,我们进行单独思考,对仅有第一个球为 P 时操作数为 1,那么仅有第 N
    个球为 B 时,前面的 P 球被弹出,第 N 个球变为 P,又填入了 N-1 个 B 球。

  • 接下来的问题就是将前面的 N-1 个 B 球转化掉。
    于是从栈底往栈顶推,保证栈底开始向上连续个球全部变为 P,之后就不需要再对这
    连续个 P 球操作,问题就变为子问题。

  • 然后对于第 N 个为 B 的球的操作数,等于前面 N-1 个球转化的操作数之和加上自己
    为 1 的操作数,可以推出 1,2(1+1),4(1+2+1),8(1+2+4+1)……
    所以知道了对于任意一种只有一个 B 球的情况的操作数

  • 接下来需要证明彼此间不能互相影响(注意点 1),于是答案就是里面所有为 B 的球
    的操作数之和。

  • 那么程序上的实现就是很简单的二进制转十进制了。

要注意两个点。

1.意识到蓝球不会对彼此产生影响,因为可见使得蓝球变为粉球,仅有操作中的第
二步,那么当一个蓝球 可以发生改变的时候,他之前的蓝球定然已经全部转化成
粉球了,同理它的转化也不会影响到之后的蓝球的转化,因此才能确定最后答案
是各个蓝球的代价数之和,即转化为二进制后直接转为十进制作为答案。

2.这是个栈!所以要注意加入的顺序,最后转化的二进制串是和输入反过来的


代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char s[70],a[70]={0};
int n;
int main(){
freopen("ball.in","r",stdin);
freopen("ball.out","w",stdout);
int n;
scanf("%d",&n);
scanf("%s",s);
for(register int i=0;i<n;++i) if(s[i]=='B') a[i]++;
long long ans=0;
for(register int i=0;i<=n;++i) {
if(a[i])
ans+=pow(2,i);
}
printf("%lld",ans);
return 0;
}

最新文章

  1. Android的项目不能直接引用可移植类库的项目解决方法
  2. 对于(function(){}())和function(){}实例的作用域分析(里面有很多问题……)
  3. memcached 学习 1—— memcached+spring配置
  4. jdk版本比较
  5. Osmocom-BB MOTO C118硬刷
  6. C# 特性Attributes 和反射
  7. C语言基础知识--位运算
  8. ajaxfileupload踩过的坑
  9. Word Ladder II 解答
  10. JavaScript动画:offset家族和匀速动画详解(含轮播图的实现)
  11. JQuery:怎么动态切换一个元素的显示、隐藏呢?原来隐藏就显示,原来显示就隐藏
  12. IdentityServer4【Reference】之Profile Service
  13. R语言求根
  14. arm-fsl-linux-gnueabi交叉编译器安装
  15. 029、限制容器的block IO(2019-01-24 周四)
  16. 一个有趣的小例子,带你入门协程模块-asyncio
  17. sqli-labs(十二)(and和or的过滤)
  18. 理解Sql Server 事务隔离层级(Transaction Isolation Level)
  19. ANSI C 常见宏的使用
  20. 使用idea 在springboot添加本地jar包的方法

热门文章

  1. 小程序中支持es7的async语法
  2. utf8字符集下的比较规则
  3. [设计模式] 读懂UML图
  4. [刷题] PTA 6-10 阶乘计算升级版
  5. mate桌面用户 root 自动登录lightdm.conf -20190520 方法【fedora 21】mate
  6. 【转载】spice 有截图
  7. 039.Python使用TCP实现多用户并发
  8. 云计算OpenStack环境搭建(4)
  9. linux 服务开机自启动systemd方式 (Centos7)
  10. 『言善信』Fiddler工具 — 3、Fiddler界面布局详解【菜单栏】