題目連結: https://tioj.ck.tp.edu.tw/problems/1026

# 內容

大家都知道魯夫吃過橡皮果實,而一旦有人貪心吃了第二顆惡魔果實,就會被炸成碎片。有一天魯夫吃了一顆惡猿果實,是沒有被炸成碎片,但是身體卻產生了奇妙的轉變。
他的行為開始變得非常二元,因此他走路時,第一步總是長 1 公尺,但每走一步路,腳的長度就會增長為二倍,相對的步伐長度也增為二倍,也就是說,走第 k 步時他能走的距離是 2k-1 公尺。
有一天,魯夫在他正前方 d 公尺發現了寶藏,其中 d 為奇數,但第 k 步他只能往寶藏的方向或往寶藏的反方向走 2k-1 公尺。請幫幫魯夫得到寶藏,告訴他最快走到寶藏要走幾步,並且應該如何走?

# 思路

每次步伐的距離因為都是 2 倍,剛好跟二進位的算法是一樣的,不過二進位是用累加方式計算,本題有加有減,但是只要轉換一下想法,因為剛好是兩倍,所以下一步減現在這一步會等於這一步的距離,所以只要把二進位為 0 的部分變成 1,然後右邊一階變成 0,就可以跟二進位一樣的算法了。

# 程式碼

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed  main() {
        int d; cin>>d;
        int i = 0; bool bb[32]={};
        for(;d;i++){
            bb[i] = d&1;
            d>>=1;
        }
        cout<<i<<endl;
        for(int j =1;j<i;j++)
            if(!bb[j]) bb[j]=1,bb[j-1] =0;
        for(int j = 0;j<i;j++)
            cout<<(bb[j]?'+':'-');
        cout<<endl;
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay