1. 程式人生 > >Codeforces 399B - Red and Blue Balls

Codeforces 399B - Red and Blue Balls

二進制 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