2016年11月10日 星期四

TIOJ 1026 - 惡猿果實

http://tioj.infor.org/problems/1026

反過來想 一開始先從最大步的開始走 然後每次/2
就發現 如果現在的數是正的 代表這一步一定是向右走的
(因為就算全部都往左最後往右還是正的) 反之
所以就扣掉(或加回來) 然後繼續走 直到回原點
然後記得反過來輸出就好



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<bits/stdc++.h>
using namespace std;
#define ll long long

string ans;
ll d,mxi;

void walk(){
    if(d>0){
        ans='+'+ans;
        d-=mxi;
    }
    else{
        ans='-'+ans;
        d+=mxi;
    }
    mxi>>=1;
}

int main(){
    cin>>d;
    {
        mxi=1;
        for(;mxi<=d;mxi<<=1){}
        mxi>>=1;
    }
    while(d){
        walk();
    }
    cout<<ans.length()<<'\n'<<ans<<'\n';
}

沒有留言:

張貼留言