Problem:
F: Power of Power
ICPC で良い成績を収めるには修行が欠かせない．うさぎは ICPC で勝ちたいので，今日も修行をすることにした．
今日の修行は，非常に大きな数の計算を行って，計算力をつけて意識を高めようというものである．大きい数が簡単に出てくる演算として，累乗が挙げられる．
N
個の非負整数
A
1
,
A
2
, ...,
A
N
がある．これらの並べ替え
B
1
,
B
2
, ...,
B
N
であって，
B
1
B
2
...
B
N
- 1
B
N
が最大になるものを求めたい．うさぎたちにとってはもちろん常識であるが，この計算は右上から順に行う．また，0
0
= 1 であると約束することにする．
最大条件を満たす
B
1
,
B
2
, ...,
B
N
は複数通りあるかもしれない．そのような場合は，そのうちで辞書順最小の列を選ぶことにしよう．
Input
N
A
1
...
A
N
1 ≤
N
≤ 100，0 ≤
A
i
≤ 1,000,000,000 を満たす．
Output
出力は
N
行からなる．
i
行目には
B
i
を出力せよ．
Sample Input 1
4
7
5
10
6
Sample Output 1
5
6
7
10
Sample Input 2
3
0
0
1000000000
Sample Output 2
1000000000
0
0

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(x) begin(x),end(x)

using namespace std;
using ld = long double;

vector<int> solve2(const vector<int>& v) {
  int n = v.size();
  int mi = 0, mj = 0;
  ld mx = -INFINITY;
  REP(i,n)REP(j,n) {
    if (i == j) continue;
    ld val;
    if (v[i] == 0 && v[j] == 0) {
      val = 0;
    } else {
      val = v[i] * log(v[j]);
    }
    if (val > mx) {
      mx = val;
      mi = i;
      mj = j;
    }
  }
  vector<int> res = {v[mj], v[mi]};
  return res;
}

vector<int> solve(const vector<int>& v) {
  int n = v.size();
  if (n <= 1) return v;
  if (n == 2) {
    return solve2(v);
  }
  int mi = 0, mj = 0, mk = 0;
  ld mx = -INFINITY;
  REP(i,n)REP(j,n)REP(k,n) {
    if (i == j) continue;
    if (i == k) continue;
    if (j == k) continue;
    ld val;
    if (v[j] == 0 && v[k] == 0) {
      val = 0;
    } else {
      val = v[j] * log(4.0 * v[k]);
    }
    if (v[i] == 0 && val == 0) {
      val = 0;
    } else {
      val = v[i] * log(val);
    }
    if (val > mx) {
      mx = val;
      mi = i;
      mj = j;
      mk = k;
    }
  }
  vector<int> er = {mi, mj, mk};
  sort(ALL(er), greater<int>());
  auto nv = v;
  REP(i,3) nv.erase(begin(nv)+er[i]);
  sort(ALL(nv));
  nv.push_back(v[mk]);
  nv.push_back(v[mj]);
  nv.push_back(v[mi]);
  return nv;
}

int main() {
  int n;
  cin>>n;
  vector<int> v;
  REP(i,n) {
    int m;
    cin>>m;
    v.emplace_back(m);
  }
  auto res = solve(v);
  for (int i:res) {
    cout << i << endl;
  }
  return 0;
}
accuracy: 0.041666666666666664
time_ms: 40
memory_kb: 3572
final_rank: 2

code_snippet: #include <bits/stdc++.h>
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(x) begin(x),end(x)

using namespace std;
using ld = long double;

vector<int> solve2(const vector<int>& v) {
  int n = v.size();
  int mi = 0, mj = 0;
  ld mx = -INFINITY;
  REP(i,n)REP(j,n) {
    if (i == j) continue;
    ld val;
    if (v[i] == 0 && v[j] == 0) {
      val = 0;
    } else {
      val = v[i] * log(v[j]);
    }
    if (val > mx) {
      mx = val;
      mi = i;
      mj = j;
    }
  }
  vector<int> res = {mj, mi};
  return res;
}

vector<int> solve(const vector<int>& v) {
  int n = v.size();
  if (n <= 1) return v;
  if (n == 2) {
    return solve2(v);
  }
  int mi = 0, mj = 0, mk = 0;
  ld mx = -INFINITY;
  REP(i,n)REP(j,n)REP(k,n) {
    if (i == j) continue;
    if (i == k) continue;
    if (j == k) continue;
    ld val;
    if (v[j] == 0 && v[k] == 0) {
      val = 0;
    } else {
      val = v[j] * log(4.0 * v[k]);
    }
    if (v[i] == 0 && val == 0) {
      val = 0;
    } else {
      val = v[i] * log(val);
    }
    if (val > mx) {
      mx = val;
      mi = i;
      mj = j;
      mk = k;
    }
  }
  vector<int> er = {mi, mj, mk};
  sort(ALL(er), greater<int>());
  auto nv = v;
  REP(i,3) nv.erase(begin(nv)+er[i]);
  sort(ALL(nv));
  nv.push_back(v[mk]);
  nv.push_back(v[mj]);
  nv.push_back(v[mi]);
  return nv;
}

int main() {
  int n;
  cin>>n;
  vector<int> v;
  REP(i,n) {
    int m;
    cin>>m;
    v.emplace_back(m);
  }
  auto res = solve(v);
  for (int i:res) {
    cout << i << endl;
  }
  return 0;
}
accuracy: 0.025
time_ms: 40
memory_kb: 3528
final_rank: 3

code_snippet: #include <bits/stdc++.h>
#define FOR(i,k,n) for(int i=(k);i<(int)(n);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(x) begin(x),end(x)

using namespace std;
using ld = long double;

vector<int> solve(const vector<int>& v) {
  int n = v.size();
  if (n <= 1) return v;
  int mi = 0, mj = 0, mk = 0;
  ld mx = -INFINITY;
  REP(i,n)REP(j,n)REP(k,n) {
    if (i == j) continue;
    if (i == k) continue;
    if (j == k) continue;
    ld val;
    if (v[j] == 0 && v[k] == 0) {
      val = 0;
    } else {
      val = v[j] * log(4.0 * v[k]);
    }
    if (v[i] == 0 && val == 0) {
      val = 0;
    } else {
      val = v[i] * log(val);
    }
    if (val > mx) {
      mx = val;
      mi = i;
      mj = j;
      mk = k;
    }
  }
  vector<int> er = {mi, mj, mk};
  sort(ALL(er), greater<int>());
  auto nv = v;
  REP(i,3) nv.erase(begin(nv)+er[i]);
  sort(ALL(nv));
  nv.push_back(v[mk]);
  nv.push_back(v[mj]);
  nv.push_back(v[mi]);
  return nv;
}

int main() {
  int n;
  cin>>n;
  vector<int> v;
  REP(i,n) {
    int m;
    cin>>m;
    v.emplace_back(m);
  }
  auto res = solve(v);
  for (int i:res) {
    cout << i << endl;
  }
  return 0;
}
accuracy: 0.025
time_ms: 50
memory_kb: 3516
final_rank: 4

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

string dp[101][101][2];//zero, one, 0or1

int main(){
    for(int y=1;y<=100;y++) dp[0][y][1]=string(y,'1');
    for(int x=1;x<=100;x++){
        if(x%2){
            dp[x][0][0]=string(x,'0');
        }else{
            dp[x][0][1]=string(x,'0');
        }
    }
    for(int x=1;x<=100;x++){
        for(int y=1;y<=100;y++){
            if(dp[x-1][y][1]!=""){
                dp[x][y][0]="0"+dp[x-1][y][1];
            }else{
                dp[x][y][0]="";
            }
            dp[x][y][1]="1"+dp[x][y-1][0];
            if(dp[x-1][y][0]!="") dp[x][y][1]=min(dp[x][y][1], "0"+dp[x-1][y][0]);
            if(dp[x][y-1][1]!="") dp[x][y][1]=min(dp[x][y][1], "1"+dp[x][y-1][1]);
        }
    }

    int N;
    cin>>N;
    vector<int> V;
    int zero=0, one=0;
    for(int i=0;i<N;i++){
        int a;
        cin>>a;
        if(a==0){
            zero++;
        }else if(a==1){
            one++;
        }else{
            V.push_back(a);
        }
    }
    sort(V.begin(),V.end());
    string s;
    if(zero%2==1&&!one){
        if(V.size()>=2) swap(V.front(),V.back());
        if(V.size()>0){
            s='0'+V.back();
            V.pop_back();
        }
    }
    int n = V.size();
    if(n>=2&&V[n-2]==2&&V[n-1]==3) swap(V[n-2],V[n-1]);
    for(auto v:V){
        cout<<v<<endl;
    }
    if(zero%2&&!one){
        s+=dp[zero][one][0];
    }else{
        s+=dp[zero][one][1];
    }
    for(auto c:s)cout<<c<<endl;

    return 0;
}
accuracy: 0.4
time_ms: 10
memory_kb: 6032
final_rank: 1