結果
| 問題 |
No.1630 Sorting Integers (Greater than K)
|
| コンテスト | |
| ユーザー |
snow39
|
| 提出日時 | 2021-07-30 21:15:26 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 75 ms / 2,000 ms |
| コード長 | 2,731 bytes |
| コンパイル時間 | 1,555 ms |
| コンパイル使用メモリ | 110,040 KB |
| 最終ジャッジ日時 | 2025-01-23 11:01:04 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 22 |
ソースコード
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <vector>
#define mkp make_pair
#define mkt make_tuple
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
const ll MOD = 1e9 + 7;
// const ll MOD = 998244353;
template <class T>
void chmin(T &a, const T &b) {
if (a > b) a = b;
}
template <class T>
void chmax(T &a, const T &b) {
if (a < b) a = b;
}
const int L = 10;
void solve() {
int N;
cin >> N;
string K;
cin >> K;
vector<int> C(L, 0);
for (int i = 1; i < L; i++) cin >> C[i];
if (K.size() > N) {
cout << -1 << endl;
return;
}
string zero(N - K.size(), '0');
K = zero + K;
vector<vector<int>> cnt(N + 1, vector<int>(L, 0));
for (int i = N - 1; i >= 0; i--) {
for (int j = 1; j < L; j++) {
if (K[i] - '0' == j)
cnt[i][j] = cnt[i + 1][j] + 1;
else
cnt[i][j] = 0;
}
}
vector<int> rest = C;
string ans = "";
bool is_greater = false;
for (int k = 0; k < N; k++) {
int digit = -1;
if (is_greater) {
for (int i = 1; i < L; i++) {
if (rest[i] > 0) {
digit = i;
break;
}
}
} else {
for (int i = 1; i < L; i++) {
if (i < K[k] - '0') continue;
if (rest[i] == 0) continue;
if (i > K[k] - '0') {
digit = i;
break;
}
int now = k + 1;
bool will_be_greater = false;
for (int d = L - 1; d >= 1; d--) {
int r = rest[d];
if (i == d) r--;
if (r == cnt[now][d]) {
now += cnt[now][d];
continue;
} else if (r < cnt[now][d]) {
break;
} else {
will_be_greater = true;
break;
}
}
if (will_be_greater) {
digit = i;
break;
}
}
}
if (digit == -1) {
cout << -1 << endl;
return;
}
ans += char('0' + digit);
rest[digit]--;
if (digit > K[k] - '0') is_greater = true;
}
cout << ans << endl;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
solve();
return 0;
}
snow39