洛谷 CF399B【Red and Blue Balls】題解

n年沒有更博客:我總結出了規律,當學的東西很可貴時候都去學習,沒有時間寫博客,只有c++

內容對於我這種蒟蒻友好,又讓我很是閒的慌時才寫博客,這種博客之後也沒有價值(也有些是作完一道題有成就感寫的)學習

最近內容就不友好,離着一篇最近的博客還有10幾天,那個也是由於有成就感....spa

這個是以前寫好的,搬到這裏來只是不會以爲太長時間沒有更博客code


這個題一開始我把左右搞反了ci

結果考試0分get

反過來就對了。。。。博客


分割線string

若是一個棧中最低端已是紅球就至關於不用處理棧底it

假設一個棧中只有藍球,會是多少步呢?class

由打表可知:前5項爲

1 3 7 15 31

有什麼規律呢?
1 + 2 = 3
3 + 4 = 7
7 + 8 = 15
....

好了若是棧底是紅球剩下的就是藍球,而棧底無影響,如今這種狀況咱們知道了

但是。。。大多數不是這樣

好比紅紅藍紅藍紅。。。。

這怎麼辦??

咱們嘗試轉換已知問題,發現紅紅...藍只須要一步便可變爲

藍藍...紅

而後這樣每次棧頂是藍色用第一種方法解決,不是就花一步轉換

#include<bits/stdc++.h>

using namespace std;

long long n,a[1001];
char ch;
long long b[60] = {0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215,33554431,67108863,134217727,268435455,536870911,1073741823,2147483647,4294967295,8589934591,17179869183,34359738367,68719476735,137438953471,274877906943,549755813887,1099511627775,2199023255551,4398046511103,8796093022207,17592186044415,35184372088831,70368744177663,140737488355327,281474976710655,562949953421311,1125899906842623};
//long long c[60] = {0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312};//打表(由於只有50的數據範圍

int main() {
    cin>>n;
    /*
    string s;
    cin>>s;
    int len = s.length();
    for(int i = 0;i < len;++i){
        a[i + 1] = s[i] - 'B';
    }
    */
    ch = getchar();
    while(ch < 'A' || ch > 'Z')//去掉多餘字符
        ch = getchar();
    for(long long i = 1; i <= n; ++i) {
        a[i] = ch - 'B';
        ch = getchar();
    }//16爲紅0爲藍
    long long y = n,tot = 0,x = 0;
    x = 0;
    for(int i = n; i >= 1; --i) {//把棧頂連續藍的轉換成紅的
        if(a[i] == 0) {
            x ++;
            a[i] = 16;
        } else {
            y = i;
            break;
        }
    }
    tot += b[x];
    for(int i = y; i > 0; --i) {//若是是藍的,花一步轉換爲一直問題
        x++;
        if(a[i] == 0) {
            tot += b[x - 1] + 1;
        }
    }
    
    cout<<tot<<endl;

    return 0;
}
相關文章
相關標籤/搜索