Problem:
対称３進数
1 グラム、3 グラム、9 グラム、27 グラムのおもりが１つずつあれば、天びんを使って 1 グラムから 40グラムまで 1 グラム刻みで量れることが知られています。たとえば、天びんの一方の皿に重さを量りたいものと 3 グラムのおもりを載せ、もう一方の皿に 27 グラムと 1 グラムのおもりを載せて釣り合えば、量りたいものの重さは 27-3+1=25 グラムだとわかります。 さらに、1(=3
0
)グラム、3
1
グラム、... 、3
n-1
グラム、3
n
グラムまでのおもりが１つずつあれば、天びんを使って(3
n+1
-1)/2グラムまで量れることが知られています。また、天びんが釣り合うようなおもりの置き方は一通りしかないことも知られています。
量りたいものとおもりを天びんに置いて、釣り合うようなおもりの置き方を文字列で表すことができます。3
i
グラムのおもりを量りたいものと同じ皿に載せたときは「
-
」、もう一方の皿に載せたときは「
+
」、どちらにも載せなかったときは「0」を文字列の右端からi番目に書きます（右端を０番目と数えます）。たとえば、先ほどの 25 グラムの例は
+0-+
と表わせます。
それでは、量りたいものの重さが与えられたとき、天びんが釣り合うようなおもりの置き方を表す文字列を出力するプログラムを作成してください。ただし、３のべき乗グラムのおもりは、どのような重さのものでも必ず１つあるものとします。
（補足： 対称３進数について）
量りたいものの重さがwのとき、おもりの置き方を表す文字列はwの対称３進数になっています。対称３進数とは、３のべき乗の数で位取りを行い、各位に数 1、0、-1 を表す文字を書くことで表した数のことです。上の文字列では、文字「
+
」、「
0
」、「
-
」がそれぞれ数 1、0、-1 に対応します。たとえば、25 グラムのものを量るときのおもりの置き方が
+0-+
である対称３進数が表す数は、1 × 3
3
+ 0 × 3
2
- 1× 3
1
+ 1 × 3
0
= 25 となります。
入力
入力は以下の形式で与えられる。
w
w
(1 ≤
w
≤ 100000) は量りたいものの重さを表す整数である。
出力
おもりの置き方を表す文字列を出力する。ただし文字列の左端を 0 にしてはならない。
入出力例
入力例１
25
出力例１
+0-+
入力例２
2
出力例２
+-
入力例３
5
出力例３
+--

Submitted solutions:

code_snippet: #include <algorithm>
#include <array>
#include <iostream>
#include <stack>
#include <string>
#include <vector>


namespace {
    const std::array<int, 12> digits{
        1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147 };
    std::vector<std::string> opt(100001);
}


int main()
{
    std::stack<std::pair<std::string, int>> queue;
    queue.emplace("", 0);
    while (!queue.empty()) {
        const auto e = std::move(queue.top());
        queue.pop();
        if ((e.first.empty() || e.first[0] != '0') && 0 <= e.second && e.second < opt.size()) {
            opt[e.second] = e.first;
        }
        if (e.first.length() < digits.size()) {
            queue.emplace(std::move("+" + e.first), e.second + digits[e.first.length()]);
            queue.emplace(std::move("-" + e.first), e.second - digits[e.first.length()]);
            queue.emplace(std::move("0" + e.first), e.second);
        }
    }
    
    int w;
    std::cin >> w;
    std::cout << opt[w] << std::endl;

    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 6144
final_rank: 5

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll = long long;

int main(){
    int d = 1;
    vector<int> b;
    while(b.size() < 14){
        b.push_back(d);
        d *= 3;
    }
    int w;
    cin >> w;
    function<bool(int,int,string)> dfs = [&](int i, int v, string s){
        if(v == w){
            reverse(s.begin(), s.end());
            cout << s << '\n';
            return true;
        }
        if(i == b.size())return false;
        if(dfs(i + 1, v - b[i], s + '-'))return true;
        if(dfs(i + 1, v, s + '0'))return true;
        if(dfs(i + 1, v + b[i], s + '+'))return true;
        return false;
    };
    dfs(0, 0, "");
}
accuracy: 1
time_ms: 70
memory_kb: 3440
final_rank: 10

code_snippet: #include<bits/stdc++.h>
using namespace std;
int w,ff;
vector<int> v;
void f(int);
int pw(int x)
{
	if(x==0) return 1;
	else {
		int sm=1;
		for(int i=0;i<x;i++) sm*=3;
		return sm;
	}
}
int main()
{
	scanf("%d",&w);
	f(0);
	return 0;
}
void f(int nn)
{
	int sm=0,sm2=w;
	//printf("nn=%d\n",nn);
	if(nn<15){
		for(int i=0;i<v.size();i++){
			if(v[i]==1) sm+=pw(i);
			else if(v[i]==2)sm2+=pw(i);
		}
		if(sm==sm2){
			ff=1;
			for(int i=v.size()-1;i>=0;i--){
				if(v[i]==1) printf("+");//you
				else if(v[i]==2) printf("-");//me
				else printf("0");//not me&you
			}
			printf("\n");
		}
		else if(ff==0){
			for(int i=0;i<3;i++){
				v.push_back(i);
				f(nn+1);
				v.pop_back();
			}
		}
	}
}
accuracy: 1
time_ms: 350
memory_kb: 3212
final_rank: 17

code_snippet: #include<iostream>
using namespace std;
int w;
int p3[12];
main()
{
	cin>>w;
	p3[0]=1;
	for(int i=1;i<12;i++)p3[i]=p3[i-1]*3;
	for(int i=0;i<1<<12;i++)
	{
		for(int j=i;;j=j-1&i)
		{
			int now=0;
			for(int k=0;k<12;k++)
			{
				if(j>>k&1)now-=p3[k];
				else if(i>>k&1)now+=p3[k];
			}
			if(now==w)
			{
				string ans="";
				for(int k=12;k--;)
				{
					if(j>>k&1)ans+='-';
					else if(i>>k&1)ans+='+';
					else if(!ans.empty())ans+='0';
				}
				cout<<ans<<endl;
				return 0;
			}
			if(j==0)break;
		}
	}
}
accuracy: 1
time_ms: 10
memory_kb: 3200
final_rank: 1

code_snippet: #include <bits/stdc++.h>
using namespace std;
/*
#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")    
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_int.hpp>
namespace mp = boost::multiprecision;
using Bint = mp::cpp_int;
using Real = mp::number<mp::cpp_dec_float<1024>>;
*/
#define ll long long
#define INF 999999999999
#define rep(i,m,n) for(ll i = m;i < n;i++)
#define rrep(i,m,n) for(ll i=m-1;i>=n;i--)
#define pb(n) push_back(n)
#define UE(N) N.erase(unique(N.begin(),N.end()),N.end());
#define Sort(n) sort(n.begin(), n.end())
#define Rev(n) reverse(n.begin(),n.end())
#define Out(S) cout << S << endl
#define NeOut(S) cout << S
#define HpOut(S) cout << setprecision(50) << S << endl
#define Vec(K,L,N,S) vector<L> K(N,S)
#define DV(K,L,N,M,S) vector<vector<L>> K(N,vector<L>(M,S))
#define TV(K,L,N,M,R,S) vector<vector<vector<L>>> K(N,vector<vector<L>>(M,vector<L>(R,S)))
#define pint pair<lli,lli>
#define paf(L,R) pair<L,R>
#define mod 1000000007
#define MAX 10000000
#define ALL(a)  a.begin(),a.end()
#define chmax(a, b) a = (((a)<(b)) ? (b) : (a))
#define chmin(a, b) a = (((a)>(b)) ? (b) : (a))

string ans;

void dfs(ll res, string S) {
    if(!res) ans = S;
    else if(S.size() < 12) {
        dfs(res - pow(3, S.size()), S + "+");
        dfs(res + pow(3, S.size()), S + "-");
        dfs(res, S + "0");
    }
}

int main() {
  	ios::sync_with_stdio(false);
  	cin.tie(0);
	ll N;
    cin >> N;
    dfs(N, "");
    Rev(ans);
    cout << ans << endl;    
}
accuracy: 1
time_ms: 20
memory_kb: 3828
final_rank: 4

code_snippet: #include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
typedef long long ll;

int main() {
    int w;
    cin >> w;
    for (int i = 0; i < pow(3, 15); i++) {
        ll x = i;
        ll now = 0;
        ll t = 1;
        for (int j = 0; j < 15; j++) {
            if (x % 3 == 0)now += t;
            else if (x % 3 == 1) now -= t;
            x /= 3;
            t *= 3;
        }

        if (now == w) {
            string ret;
            x = i;
            t = 1;
            for (int j = 0; j < 15; j++) {
                if (x % 3 == 0)ret = '+' + ret;
                else if (x % 3 == 1)ret = '-' + ret;
                else ret = '0' + ret;
                x /= 3;
                t *= 3;
            }

            bool notzero = false;
            for (int j = 0; j < 15; j++) {
                if (ret[j] != '0')notzero = true;
                if (notzero)cout << ret[j];
            }
            cout << endl;
            break;
        }
    }
    return 0;
}
accuracy: 1
time_ms: 430
memory_kb: 3212
final_rank: 18

code_snippet: #include <iostream>
using namespace std;
using llong = long long;

llong w;
llong pt[15];
char ans[15];

bool dfs(int i, llong d) {
	if (i == 15 && d == w) return true;
	else if (i == 15) return false;
	
	bool f = false;
	
	if (dfs(i + 1, d + pt[i])) ans[i] = '+', f = true;
	
	if (dfs(i + 1, d)) ans[i] = '0', f = true;
	
	if (dfs(i + 1, d - pt[i])) ans[i] = '-', f = true;
	
	return f;
}

int main() {
	cin >> w;
	
	pt[0] = 1;
	for (int i = 1; i < 15; i++) {
		pt[i] = pt[i - 1] * 3;
	}
	
	dfs(0, 0);
	
	bool f = false;
	for (int i = 14; i >= 0; i--) {
		if (ans[i] != '0') f = true;
		
		if (f) cout << ans[i];
	}
	cout << endl;
	
	return 0;
}
accuracy: 1
time_ms: 40
memory_kb: 3108
final_rank: 8

code_snippet: #include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
#include <bitset>
#define chmin(a, b) ((a) = min((a), (b)))
#define chmax(a, b) ((a) = max((a), (b)))
#define fs first
#define sc second
#define eb emplace_back
using namespace std;

typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;

const ll MOD = 1e9 + 7;
const ll INF = 1e18;
const double pi = acos(-1);
const double eps = 1e-10;

int dx[] = {1, 0, -1, 0};
int dy[] = {0, -1, 0, 1};

vector<int> v;

void dfs(int l, int r, int depth, string s){

    if(depth == v.size()){
        if(l == r){
            cout << s << endl;
        }
        return ;
    }

    dfs(l + v[depth], r, depth + 1, s + "+");

    dfs(l, r, depth + 1, s + "0");

    dfs(l, r + v[depth], depth + 1, s + "-");

    return ;
}


int main(){
    int w; cin>>w;
    int num = 1;
    int sum = 0;
    while(sum < w){
        v.emplace_back(num);
        sum += num;
        num *= 3;
    }

    sort(v.begin(), v.end(), greater<int>());

    dfs(0, w, 0, "");
}
accuracy: 1
time_ms: 30
memory_kb: 3200
final_rank: 7

code_snippet: #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <climits>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#include <string>

#define REP(i,n) for(long long i=0;i<n;++i)
#define REPR(i,n) for(long long i=n;i>=0;--i)
#define REPI(itr,v) for(auto itr=v.begin();itr!=v.end();++itr)
#define REPIR(itr,v) for(auto itr=v.rbegin();itr!=v.rend();++itr)
#define FOR(i,a,b) for(long long i=a;i<b;++i)
#define SORT(v,n) sort(v, v+n)
#define SORTV(v) sort(v.begin(), v.end())
#define ALL(v) v.begin(),v.end()
#define llong long long
#define INF 999999999
#define MOD 1000000007
#define pb push_back
#define pf push_front
#define MP make_pair
#define SV(v) {for(long long sitr=0;sitr<v.size();++sitr){cin>>v[sitr];}}

int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};

using namespace std;

typedef pair<int,int> pii;

int MAX = 1;
int w;

void solve(string s, int level, int sum){
  
  if(sum == 0){
    int len = s.length();
    for(int i = len - 1; i >= 0; --i){
      cout << s[i];
    }
    cout << endl;
    return;
  }
  if(level == MAX + 1) return;

  //減らす
  solve(s + "+", level + 1, sum - pow(3,level));
  //そのまま
  solve(s + "0", level + 1, sum);
  //増やす
  solve(s + "-", level + 1, sum + pow(3, level));

}

int main(){

  cin >> w;

  int sum = 3;
  while(true){
    if(sum >= 2 * w + 1) break;
    MAX++;
    sum *= 3;
  }

  solve("", 0, w);


  return 0;
}
accuracy: 1
time_ms: 160
memory_kb: 3352
final_rank: 13

code_snippet: #include<iostream>
#include<string>
#include<cmath>
using namespace std;

string res;

void solve( string s, int cnt, int ans )
{
    if( cnt == 0 )
    {
        int sum = 0;
        for( int i = 0; i < s.size(); i++ )
        {
            if( s[i] == '+' )
                sum += (int)pow( 3.0, (double)i );
            else if( s[i] == '-' )
                sum -= (int)pow( 3.0, (double)i );
        }
        if( sum == ans )
            res = s;
        return;
    }

    solve( s + '+', cnt - 1, ans );
    solve( s + '-', cnt - 1, ans );
    solve( s + '0', cnt - 1, ans );
}

int main()
{    
    int n;

    cin >> n;

    int a = 1, cnt = 1;
    while( a < n )
    {
        a *= 3;
        cnt++;
    }

    string s = "";
    solve( s, cnt, n );

    string rev = "";
    int i = res.size() - 1;
    while( res[i] == '0' )
        i--;

    for( int j = i; j >= 0; j-- )
        rev += res[j];

    cout << rev << endl;

    return 0;
}
accuracy: 1
time_ms: 200
memory_kb: 3364
final_rank: 15

code_snippet: #include<iostream>
#include<algorithm>
using namespace std;

int w;

void dfs(int d, int acc, string s){
    if(acc == w){
        reverse(s.begin(), s.end());
        cout << s << endl;
        exit(0);
    }
    
    if(d >= 12) return;

    int t = 1;
    for(int i = 0; i < d; i++)  t *= 3;

    dfs(d+1, acc+t, s+"+");
    dfs(d+1, acc, s+"0");
    dfs(d+1, acc-t, s+"-");
}

int main(){
    cin >> w;
    dfs(0, 0, "");
}
accuracy: 1
time_ms: 20
memory_kb: 3204
final_rank: 3

code_snippet: #include "bits/stdc++.h"
using namespace std;

typedef long long ll;
typedef vector<ll> V;
typedef pair<ll,ll> P;
typedef map<ll,ll> M;

#define REP(i, n) for(ll (i) = 0; (i) < (n); ++(i))
#define FOR(i, j, n) for(ll (i) = (j); (i) < (n); ++(i))
#define REPR(i, n) for(ll (i) = (n); (i) >= 0; --(i))

signed main(){
    int w;
    cin >> w;
    V three(1, 1);
    ll assm = 1;
    while(assm < w){
        three.push_back(three.back() * 3);
        assm += three.back();
    }

    int n = three.size();
    three.push_back(three.back() * 3);

    REP(i, three.back()){
        ll ans = 0;
        V vec(n);
        REP(j, n){
            vec[j] = (i % three[j + 1]) / three[j];
            if(vec[j] == 1)ans += three[j];
            if(vec[j] == 2)ans -= three[j];
        }
        if(ans == w){
            REPR(j,n-1){
                if(vec[j] == 1)cout << "+";
                else if(vec[j] == 2)cout << "-";
                else cout<< "0";
            }
            cout << endl;
            return 0;
        }
    }
}
accuracy: 1
time_ms: 90
memory_kb: 3168
final_rank: 12

code_snippet: #include <bits/stdc++.h>
using namespace std;

typedef struct{
  int num;
  int i;
  string ans;
} Data;

int main(){
  int n;
  cin >> n;
  queue<Data> que;

  Data d;
  d.num = n;
  d.i = 0;
  d.ans = "";

  que.push(d);

  Data tmp;

  while(1){
    d = que.front();
    que.pop();
    if(d.num == 0){
      cout << d.ans << endl;
      return 0;
    }
    d.i++;

    tmp = d;
    tmp.num += pow((double)3,(double)d.i-1);
    tmp.ans = "-" + tmp.ans;
    que.push(tmp);

    tmp = d;
    tmp.num -= pow((double)3,(double)d.i-1);
    tmp.ans = "+" + tmp.ans;
    que.push(tmp);

    tmp = d;
    tmp.ans = "0" + tmp.ans;
    que.push(tmp);
  }
}
accuracy: 1
time_ms: 260
memory_kb: 96592
final_rank: 19

code_snippet: #include<bits/stdc++.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


int POW[13];
int table[12],answer[12],W;

char func(int x){
	if(x == 1)return '+';
	else if(x == -1)return '-';
	else return '0';
}

void calc(int index){

	if(index == 12){
		int sum = 0;
		for(int i=0; i < 12; i++){
			if(table[i] == 1)sum += POW[i];
			else if(table[i] == -1){
				sum -= POW[i];
			}
		}
		if(sum == W){
			for(int i=0; i < 12; i++)answer[i] = table[i];
		}
		return;
	}

	table[index] = 0;
	calc(index+1);
	table[index] = 1;
	calc(index+1);
	table[index] = -1;
	calc(index+1);
}

int main(){

	for(int i = 0; i < 13; i++){
		POW[i] = pow(3,i);
	}

	for(int i = 0; i < 12; i++){
		table[i] = 0;
	}

	scanf("%d",&W);

	calc(0);

	for(int i = 11; i >= 0; i--){
		if(answer[i] != 0){
			for(int k=i; k >= 0; k--){
				printf("%c",func(answer[k]));
			}
			printf("\n");
			break;
		}
	}

    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3248
final_rank: 2

code_snippet: #include <bits/stdc++.h>

using namespace std;

// 3^ 14
// 3 no 13

string ans;

void solve(int cnt, int dig, int w, string s) {

    if(w == 0) {
        ans = s;
    }

    if(cnt >= 12) {
        return;
    }

    solve(cnt + 1, dig * 3, w, s + "0");
    solve(cnt + 1, dig * 3, w - dig, s + "+");
    solve(cnt + 1, dig * 3, w + dig, s + "-");

    return;
}

int main() {

    int w;
    int enable_p;

    cin >> w;

    solve(0, 1, w, "");

    reverse(ans.begin(), ans.end());

    enable_p = 0;
    for(int i = 0; i < ans.size(); ++i) {
        if(ans[i] == '0') {
            ++enable_p;
        } else {
            break;
        }
    }

    for(int i = enable_p; i < ans.size(); ++i) {
        cout << ans[i];
    }
    cout << endl;

    //cout << ans << endl;

}
accuracy: 1
time_ms: 40
memory_kb: 3196
final_rank: 9

code_snippet: #include<stdio.h>
#include<string.h>
#include<math.h>
void fanc(int,int,int);
int a,s[15],d[15],f,g,h;
int main(void)
{
	int flg,i,j;
	f=0;
	scanf("%d",&a);
	flg=0;
	fanc(0,0,1);
	for(i=14;i>=0;i--){
		if(s[i]==-1){
			printf("-");
			flg=1;
		}
		else if(s[i]==1){
			printf("+");
			flg=1;
		}
		else{
			if(flg==1) printf("0");
		}
	}
	printf("\n");
	return 0;
}
void fanc(int z,int x,int c)
{
	int i,j;
	if(z<15){
		if(x==a){
			for(i=0;i<z;i++) s[i]=d[i];
			f=1;
		}
		if(f==0){
			for(i=-1;i<=1;i++){
				d[z]=i;
				fanc(z+1,x+i*c,c*3);
			}
		}
	}
}
accuracy: 1
time_ms: 30
memory_kb: 2684
final_rank: 6

code_snippet: #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define pb emplace_back
#define INF (1e9+1)

const ll MOD = INF;

ll power(ll a,ll b){
    ll ret=1;
    if(b>0){
        ret = power(a,b/2);
        if(b%2==0)ret = (ret*ret)%MOD;
        else ret = (((ret*ret)%MOD)*a)%MOD;
    }
    return ret;
}


int main(){
    int w;
    cin>>w;
    
    int ans = -1;
    for(int i=0;i<power(3,11);i++){
        int l = 0, r = w;
        int num = i;
        rep(j,11){
            if(num%3==1){
                l+=power(3,j);
            }else if(num%3==2){
                r+=power(3,j);
            }
            num/=3;;
        }
        if(l==r){
            ans = i;
            break;
        }
    }
    
    string s = "";
    rep(i,11){
        if(ans%3==0)s+='0';
        if(ans%3==1)s+='+';
        if(ans%3==2)s+='-';
        ans/=3;
    }
    int pos = 0;
    rep(i,s.size())if(s[i]!='0')pos = i+1;
    s = s.substr(0,pos);
    reverse(all(s));
    cout<<s<<endl;
    
}
accuracy: 0.6666666666666666
time_ms: 20
memory_kb: 3172
final_rank: 20

code_snippet: #include <vector>
#include <iostream>
#include <utility>
#include <algorithm>
#include <string>
#include <deque>
#include <queue>
#include <tuple>
#include <queue>
#include <functional>
#include <cmath>
#include <iomanip>
#include <map>
#include <set>
#include <numeric>
#include <unordered_map>
#include <unordered_set>
#include <complex>
#include <iterator>
#include <array>
#include <memory>
#include <stack>
#define vi vector<int>
#define vvi vector<vector<int> >
#define ll long long int
#define vl vector<ll>
#define vvl vector<vector<ll>>
#define vb vector<bool>
#define vc vector<char>
#define vs vector<string>
#define ld long double
#define INF 1e9
#define EPS 0.0000000001
#define rep(i,n) for(int i=0;i<n;i++)
#define loop(i,s,n) for(int i=s;i<n;i++)
#define all(in) in.begin(), in.end()
template<class T, class S> void cmin(T &a, const S &b) { if (a > b)a = b; }
template<class T, class S> void cmax(T &a, const S &b) { if (a < b)a = b; }
#define MAX 9999999
using namespace std;
typedef pair<int, int> pii;
typedef pair<double,double>pdd;
#define int ll

int dif=INF;
vi v(13,0);
vi sum(13,0);
int _find;
void   dfs(int value,int index,string ans){
    if(index>_find+1)return;
    //cout<<value<<endl;
    if(value==dif){reverse(all(ans));cout<<ans<<endl;return;}
    dfs(value,index+1,ans+"0");
    dfs(value-v[index],index+1,ans+"-");
    dfs(value+v[index],index+1,ans+"+");
    return;
}
signed main(){
    int w; cin>>w;
    rep(i,13)v[i]=sum[i]=(int)pow(3,i);
    rep(i,12)sum[i+1]+=sum[i];
    rep(i,13)if(w<sum[i]){_find=i;break;}
    //cout<<_find<<endl;
    dif=w;
    int value=0;int index=1;
    string s;
    dfs(value,index,s+"0");
    dfs(value-1,index,s+"-");
    dfs(value+1,index,s+"+");
}
accuracy: 1
time_ms: 80
memory_kb: 3384
final_rank: 11

code_snippet: #include <stdio.h>
#include <stack>
#include <math.h>

using namespace std;

int answer[12],w;

char func(int x){
	if(x == 1)return '+';
	else if(x == -1)return '-';
	else return '0';
}

void calc(int array[12],int index){

	if(index == 12){
		int sum = 0;
		for(int i=0; i < 12; i++){
			if(array[i] == 1)sum += pow(3,i);
			else if(array[i] == -1){
				sum -= pow(3,i);
			}
		}
		if(sum == w){
			for(int i=0; i < 12; i++)answer[i] = array[i];
		}
		return;
	}

	int new_array[3][12];
	for(int i = 0; i < 3; i++){
		for(int k=0; k < 12; k++)new_array[i][k] = array[k];
	}

	new_array[0][index] = 0;
	calc(new_array[0],index+1);
	new_array[1][index] = 1;
	calc(new_array[1],index+1);
	new_array[2][index] = -1;
	calc(new_array[2],index+1);

}

int main(){

	int array[12] = {0};

	scanf("%d",&w);

	calc(array,0);

	for(int i = 11; i >= 0; i--){
		if(answer[i] != 0){
			for(int k=i; k >= 0; k--){
				printf("%c",func(answer[k]));
			}
			printf("\n");
			break;
		}
	}

    return 0;
}
accuracy: 1
time_ms: 180
memory_kb: 2872
final_rank: 14

code_snippet: #include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <queue>

using namespace std;

#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)

struct Data {
	string str;
	int w;
	Data() {}
	Data(string str, int w) : str(str), w(w) {}
};

bool done[30][600000];

int main() {
	int W;
	cin >> W;
	
	vector<int> table;
	int tmp = 1;
	table.push_back(tmp);
	while (tmp <= W) {
		tmp *= 3;
		table.push_back(tmp);
	}
	
	queue<Data> que;
	que.push(Data("", 0));
	
	while (!que.empty()) {
		Data now = que.front(); que.pop();
		
		string str = now.str;
		int w = now.w;
		int len = str.size();
		
		if (w == W) {
			reverse(str.begin(), str.end());
			cout << str << endl;
			break;
		}
		
		if (w + 300000 >= 600000 || w + 300000 < 0) continue;
		if (done[len][w + 300000]) continue;
		done[len][w + 300000] = true;
		
		if (len >= table.size()) continue;
		que.push(Data(str + "+", w + table[len]));
		que.push(Data(str + "-", w - table[len]));
		que.push(Data(str + "0", w));
	}
	return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 37604
final_rank: 16