題目連結: 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; | |
} |