Codeforces 399B - Red and Blue Balls
阿新 • • 發佈:2017-08-11
二進制 typedef space clas 紅色 模擬 pri 註意 ()
傳送門
題意:你有一個棧,棧有n個球,球有藍紅色。定義
1.當棧頂為紅球時,不斷移除棧頂元素
2.將棧頂的藍球更換為紅球
3.向棧裏填充藍球只至棧有n個球
為一次操作
問在第幾次操作的過程中,棧內全部為紅球
我們定義棧頂為第零層。在遊戲為結束之前,我們必定能找到一個藍色的球,滿足其比其小的層次全為紅球。定義將第i層及其上方所有球變為紅色需要的操作次數為F(i)
F(0)=1;
F(1)=1+F(0)=2;//1代表第一次操作,結果是將i層變為紅球,0~i-1層全變為藍色球
F(2)=1+F(0)+F(1)=4;
F(3)=1+F(0)+F(1)+F(2)=8;
我們可以發現F(i)等同於2^i。
原因嘛...紅球相當於二進制中的1,藍球相當於0。藍球(0)上層都是紅球(1),那麽只需1即可進位,進位後補零。題意求的就是給定狀態對應的大小與2^n的差值
很多有二元表示外加一頓奇怪的操作或復雜的模擬的題目,無論是用球,狀態,數字,都應該聯想到二進制表示。特別是如這種題目中1<=n<=50這麽小的情況
1 #include <cstdio> 2 using namespace std; 3 typedef long long LL; 4 5 int n; 6 LL ans = 0; 7 8 int main(int argc, const char* argv[]) { 9 scanf("%d", &n); 10 getchar(); 11 for (int i = 0; i <= n - 1; i++) { 12 if (getchar() == ‘B‘) ans |= ((LL)1 << i); //註意這裏的類型轉化QAQ 13 } 14 printf("%lld\n", ans); 15 return 0; 16 }
Codeforces 399B - Red and Blue Balls