#include <bits/stdc++.h> using namespace std; #define all(x) ::begin(x), ::end(x) #define tsolve int t; cin >> t; while (t--) solve #define sz(x) (int)::size(x) using ll = long long; using ld = long double; constexpr int N = 202; constexpr int inf = 1e9; int dp[N][N][N], bestK[N][N][N]; void solve() { int n; cin >> n; vector<int> f(n); vector<int> ord(n); for(int i = 0; i < n; i++){ double x; cin >> x; f[i] = (int)round(x * 1e4); } iota(all(ord), 0); sort(all(ord), [&](int i, int j){return f[i] < f[j];}); sort(all(f)); vector<int> s(n+1); for(int i = 0; i < n; i++){ s[i+1] = s[i] + f[i]; } for(int i = 1; i <= n; i++){ dp[i][0][0] = inf; for(int a = 0; a <= n; a++){ for(int b = 0; b <= n; b++){ if(a+b > n) dp[i][a][b] = inf; } } for(int sum = n; sum >= 1; sum--){ for(int a = sum; a >= 0; a--){ int b = sum-a; int best = inf; int optK = -1; for(int k = 0; k <= min(a, i); k++){ if(dp[i-k][b+a-k][a-k] < best){ optK = k; best = dp[i-k][b+a-k][a-k]; } } bestK[i][a][b] = optK; dp[i][a][b] = best + s[i]; // cerr << a << " " << b << " " << i << " " << dp[a][b][i] << "\n"; } } } vector<int> layers; { int i = n, a = 1, b = 1; while(i > 0){ int k = bestK[i][a][b]; layers.push_back(k); i -= k; int a2 = b+a-k, b2 = a-k; a = a2, b = b2; } } vector<string> ans(n); vector<string> s1, s2; s1.push_back("."); s2.push_back("-"); int p = n; for(int k : layers){ for(int i = p-k; i < p; i++){ ans[ord[i]] = s1.back(); s1.pop_back(); } p -= k; vector<string> t1, t2; t1 = s2; for(string s : s1){ string a = s, b = s; a.push_back('.'); b.push_back('-'); t1.push_back(a); t2.push_back(b); } s1 = t1, s2 = t2; } for(string s : ans){ cout << s << "\n"; } // cout << dp[n][1][1] << "\n"; } int main() { cout.tie(0)->sync_with_stdio(false); cout << setprecision(16); solve(); }