Submission #421910

#TimeUsernameProblemLanguageResultExecution timeMemory
421910juancarlovieriSequence (BOI14_sequence)C++17
67 / 100
1072 ms2280 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

int ans = 1000000000000000000;
int pw[20];

void rek(vector<int> sections, int curr = 0, int level = 0, bool flag = false) {
  if (curr >= ans) return;
  int n = sections.size();

  if (n == 1) {
    int mask = sections[0];
    if (!mask) {
      if (!curr || flag) curr += pw[level];
    } else if (mask == 1) curr += pw[level + 1];
    else {
      if (mask & 1) {
        int mn = 10;
        for (int i = 9; i; --i) {
          if (mask & (1 << i)) mn = i;
        }
        for (int i = 9; i; --i) {
          if ((mask & (1 << i)) && i != mn) curr += i * pw[level++];
        }
        curr += mn * pw[++level];
      } else {
        for (int i = 9; i; --i) {
          if (mask & (1 << i)) curr += i * pw[level++];
        }
      }
    }
    ans = min(ans, curr);
    return;
  }

  for (int i = 0; i < 10; ++i) {
    vector<int> merged;
    int ins = 0;
    bool zero = false;
    int piv = i;
    for (int j = 0; j < n; ++j) {
      zero |= (piv == 0 && (sections[j] & 1));
      ins |= (sections[j] & (~(1 << piv)));
      piv++;
      if (piv == 10) {
        merged.push_back(ins);
        ins = piv = 0;
      }
    }
    if (piv) merged.push_back(ins);
    rek(merged, curr + pw[level] * i, level + 1, zero);
  }
}

signed main() {
  int n;
  cin >> n;
  vector<int> sections(n);
  for (int i = 0; i < n; ++i) {
    int x;
    cin >> x;
    sections[i] = (1 << x);
  }
  pw[0] = 1;
  for (int i = 1; i < 18; ++i) pw[i] = 10 * pw[i - 1];
  rek(sections);
  cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...