zoukankan      html  css  js  c++  java
  • 【题解】ball 数论

    题目

    题目描述:

    众所周知的是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;
    }
    

     

  • 相关阅读:
    CSPS模拟 49
    StrGame
    CSPS模拟 48
    [没有证明]原根求法
    CSPS模拟 47
    CSPS模拟 46
    CSPS模拟 45 乔迁之喜
    CSPS模拟 44
    平衡二叉树
    go语言学习--指针数组和数组指针
  • 原文地址:https://www.cnblogs.com/bbqub/p/7755755.html
Copyright © 2011-2022 走看看