結果

問題 No.1630 Sorting Integers (Greater than K)
ユーザー gew1fw
提出日時 2025-06-12 15:01:44
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,600 bytes
コンパイル時間 183 ms
コンパイル使用メモリ 82,712 KB
実行使用メモリ 62,588 KB
最終ジャッジ日時 2025-06-12 15:02:00
合計ジャッジ時間 4,971 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 7 WA * 4 TLE * 1 -- * 10
権限があれば一括ダウンロードができます

ソースコード

diff #

def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0
    N = int(input[idx])
    idx += 1
    K = input[idx]
    idx += 1
    c = list(map(int, input[idx:idx+9]))
    idx += 9
    
    digits = []
    for i in range(9):
        digits.extend([i+1] * c[i])
    
    if len(K) > N:
        print(-1)
        return
    elif len(K) < N:
        digits.sort()
        min_first = min(d for d in digits if d != 0)
        pos = digits.index(min_first)
        digits = [min_first] + digits[:pos] + digits[pos+1:]
        print(''.join(map(str, digits)))
        return
    
    max_M = sorted(digits, reverse=True)
    max_M_str = ''.join(map(str, max_M))
    if len(max_M_str) < len(K):
        print(-1)
        return
    if max_M_str <= K:
        print(-1)
        return
    
    k_digits = list(K)
    available = c.copy()
    M = []
    for i in range(N):
        found = False
        for d in range(10):
            if available[d-1] == 0:
                continue
            if d < int(k_digits[i]):
                continue
            available[d-1] -= 1
            if d > int(k_digits[i]):
                remaining = []
                for j in range(9):
                    remaining.extend([j+1] * available[j])
                remaining.sort()
                M_part = ''.join(map(str, M + [d] + remaining))
                print(M_part)
                return
            else:
                suffix = k_digits[i+1:]
                temp_available = available.copy()
                temp_available[d-1] += 1
                temp_available[d-1] -= 1
                remaining = []
                for j in range(9):
                    remaining.extend([j+1] * temp_available[j])
                remaining.sort(reverse=True)
                max_suffix = ''.join(map(str, remaining))
                if len(max_suffix) < len(suffix):
                    available[d-1] += 1
                    continue
                for c1, c2 in zip(max_suffix, suffix):
                    if c1 > c2:
                        break
                    elif c1 < c2:
                        available[d-1] += 1
                        break
                else:
                    if len(max_suffix) > len(suffix):
                        pass
                    else:
                        available[d-1] += 1
                        continue
                M.append(d)
                found = True
                break
            available[d-1] += 1
        if not found:
            print(-1)
            return
    print(-1)

if __name__ == "__main__":
    main()
0