提出 #42966479


ソースコード 拡げる

# 27 位解法を整形

# ----- 方針 -----
# 入れ替えは上下のみ
# 小さい番号のボールから昇順に決める
# 各ボールについて、確定位置(右上と左上が確定している)まで動かす方法がいくつかあるが、
# その中で最も評価が高いものを選ぶ
# イメージ的には、なるべく大きい番号のボールの上を通るものを高評価にしている
# 逐次更新はなしで、パラメータを変えて試して一番良い結果を選んでいる

# ----- 評価関数 -----
# 評価関数は、通る道にある玉の番号を a_i とすると Σ a_i ^ e / l
# l は道の長さ(交換回数)
# e は 0.4 ≦ e ≦ 1.1 ぐらいを適当に動かす
# なお更新は 2 次元 DP でできる

# ----- e の範囲の根拠 -----
# 番号 i のボールの「適正位置」は √2i ぐらいなので、この意味では e ≒ 0.5 にするのが良さそう
# 単純合計(e ≒ 1.0)との間付近を雑に選んでいる


from time import time
from math import sqrt
sTime = time()
N = 30
M = N * (N + 1) // 2
origX = [[int(a) for a in input().split()] for _ in range(N)]
origIX = [(0, 0)] * M
for i in range(N):
    for j in range(i + 1):
        origIX[origX[i][j]] = (i, j)

BEST_ANS = []
for exp_start_100 in range(40, 111, 2):
    for exp_end_100 in range(40, 111, 3):
        if time() - sTime > 1.8:
            break
        
        X = [x[:] for x in origX]
        IX = origIX[:]
        fixed = [[0] * (i + 1) for i in range(N)]
        for i in range(N):
            fixed[i][0] += 1
            fixed[i][i] += 1
        row_remaining_count = [i + 1 for i in range(N + 1)]
        done_row_count = 0
        DP = [[0] * (i + 1) for i in range(N)] # Reusable Table
        ANS = []
        for a in range(M):
            exp = exp_start_100 / 100 + (exp_end_100 - exp_start_100) / 100 * sqrt(a) / sqrt(M)
            ii, jj = IX[a]
            DP[ii][jj] = 100000 * (a + 1) # DP テーブルを毎回初期化しなくて良いように適当に足している
            ma = 0
            mai = ii
            maj = jj
            for i in range(ii - 1, done_row_count - 1, -1):
                DPi = DP[i]
                DPi1 = DP[i+1]
                Xi = X[i]
                fixedi = fixed[i]
                for j in range(max(0, jj - (ii - i)), min(i + 1, jj + 1)):
                    evaluation = Xi[j] ** exp # ← 評価関数
                    DPi[j] = max(DPi1[j], DPi1[j+1]) + evaluation
                    if fixedi[j] == 2:
                        perf = (DPi[j] - 100000 * (a + 1)) / (ii - i) # 評価合計 ÷ 移動回数が高いものを優先
                        if perf > ma:
                            ma = perf
                            mai = i
                            maj = j
            
            i, j = mai, maj
            L = [(i, j)]
            if i + 1 < N:
                fixed[i][j] += 1
                fixed[i+1][j] += 1
                fixed[i+1][j+1] += 1
            row_remaining_count[i] -= 1
            while row_remaining_count[done_row_count] == 0:
                done_row_count += 1
            while i < ii:
                i += 1
                if DP[i][j] < DP[i][j+1]:
                    j += 1
                L.append((i, j))

            for k in range(len(L) - 1)[::-1]:
                i1, j1 = L[k]
                i2, j2 = L[k+1]
                ANS.append((i1, j1, i2, j2))
                X[i1][j1], X[i2][j2] = X[i2][j2], X[i1][j1]
                IX[X[i1][j1]] = (i1, j1)
                IX[X[i2][j2]] = (i2, j2)

        if not BEST_ANS or len(ANS) < len(BEST_ANS):
            BEST_ANS = ANS
    
ANS = BEST_ANS
print(len(ANS))
for ans in ANS:
    print(*ans)

提出情報

提出日時
問題 A - Pyramid Sorting
ユーザ Kiri8128
言語 PyPy3 (7.3.0)
得点 13519910
コード長 3855 Byte
結果 AC
実行時間 1895 ms
メモリ 106896 KiB

ジャッジ結果

セット名 test_ALL
得点 / 配点 13519910 / 15000000
結果
AC × 150
セット名 テストケース
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
ケース名 結果 実行時間 メモリ
test_0000.txt AC 1886 ms 104992 KiB
test_0001.txt AC 1892 ms 102276 KiB
test_0002.txt AC 1890 ms 102184 KiB
test_0003.txt AC 1887 ms 101540 KiB
test_0004.txt AC 1884 ms 104228 KiB
test_0005.txt AC 1884 ms 103196 KiB
test_0006.txt AC 1887 ms 105448 KiB
test_0007.txt AC 1892 ms 104948 KiB
test_0008.txt AC 1882 ms 101708 KiB
test_0009.txt AC 1887 ms 103180 KiB
test_0010.txt AC 1887 ms 104708 KiB
test_0011.txt AC 1889 ms 103632 KiB
test_0012.txt AC 1888 ms 102424 KiB
test_0013.txt AC 1885 ms 103020 KiB
test_0014.txt AC 1890 ms 104364 KiB
test_0015.txt AC 1891 ms 104264 KiB
test_0016.txt AC 1886 ms 102916 KiB
test_0017.txt AC 1887 ms 105712 KiB
test_0018.txt AC 1887 ms 103020 KiB
test_0019.txt AC 1889 ms 101408 KiB
test_0020.txt AC 1888 ms 104428 KiB
test_0021.txt AC 1888 ms 104412 KiB
test_0022.txt AC 1888 ms 103884 KiB
test_0023.txt AC 1885 ms 103284 KiB
test_0024.txt AC 1890 ms 103628 KiB
test_0025.txt AC 1887 ms 104356 KiB
test_0026.txt AC 1887 ms 102800 KiB
test_0027.txt AC 1873 ms 103340 KiB
test_0028.txt AC 1883 ms 102412 KiB
test_0029.txt AC 1895 ms 103340 KiB
test_0030.txt AC 1884 ms 101276 KiB
test_0031.txt AC 1891 ms 102588 KiB
test_0032.txt AC 1889 ms 104000 KiB
test_0033.txt AC 1889 ms 103104 KiB
test_0034.txt AC 1885 ms 102824 KiB
test_0035.txt AC 1886 ms 102876 KiB
test_0036.txt AC 1888 ms 103756 KiB
test_0037.txt AC 1892 ms 102880 KiB
test_0038.txt AC 1888 ms 104024 KiB
test_0039.txt AC 1888 ms 100456 KiB
test_0040.txt AC 1882 ms 102444 KiB
test_0041.txt AC 1891 ms 103724 KiB
test_0042.txt AC 1885 ms 102372 KiB
test_0043.txt AC 1889 ms 102372 KiB
test_0044.txt AC 1889 ms 102132 KiB
test_0045.txt AC 1892 ms 104004 KiB
test_0046.txt AC 1888 ms 101644 KiB
test_0047.txt AC 1889 ms 101904 KiB
test_0048.txt AC 1889 ms 101532 KiB
test_0049.txt AC 1891 ms 103816 KiB
test_0050.txt AC 1886 ms 102624 KiB
test_0051.txt AC 1887 ms 102084 KiB
test_0052.txt AC 1888 ms 104336 KiB
test_0053.txt AC 1886 ms 104724 KiB
test_0054.txt AC 1889 ms 103444 KiB
test_0055.txt AC 1884 ms 103928 KiB
test_0056.txt AC 1883 ms 102992 KiB
test_0057.txt AC 1889 ms 106220 KiB
test_0058.txt AC 1886 ms 103748 KiB
test_0059.txt AC 1887 ms 102168 KiB
test_0060.txt AC 1888 ms 105392 KiB
test_0061.txt AC 1886 ms 103360 KiB
test_0062.txt AC 1883 ms 103492 KiB
test_0063.txt AC 1891 ms 101756 KiB
test_0064.txt AC 1887 ms 102804 KiB
test_0065.txt AC 1882 ms 102116 KiB
test_0066.txt AC 1886 ms 103376 KiB
test_0067.txt AC 1886 ms 103484 KiB
test_0068.txt AC 1892 ms 102404 KiB
test_0069.txt AC 1887 ms 104124 KiB
test_0070.txt AC 1842 ms 103472 KiB
test_0071.txt AC 1891 ms 102288 KiB
test_0072.txt AC 1887 ms 103048 KiB
test_0073.txt AC 1892 ms 103200 KiB
test_0074.txt AC 1885 ms 103124 KiB
test_0075.txt AC 1884 ms 101056 KiB
test_0076.txt AC 1886 ms 103520 KiB
test_0077.txt AC 1887 ms 102340 KiB
test_0078.txt AC 1891 ms 102620 KiB
test_0079.txt AC 1891 ms 102124 KiB
test_0080.txt AC 1887 ms 105048 KiB
test_0081.txt AC 1886 ms 101928 KiB
test_0082.txt AC 1891 ms 100856 KiB
test_0083.txt AC 1889 ms 101916 KiB
test_0084.txt AC 1887 ms 103524 KiB
test_0085.txt AC 1892 ms 102160 KiB
test_0086.txt AC 1892 ms 102808 KiB
test_0087.txt AC 1889 ms 103876 KiB
test_0088.txt AC 1891 ms 103448 KiB
test_0089.txt AC 1887 ms 102572 KiB
test_0090.txt AC 1887 ms 102360 KiB
test_0091.txt AC 1887 ms 102128 KiB
test_0092.txt AC 1887 ms 103724 KiB
test_0093.txt AC 1887 ms 103696 KiB
test_0094.txt AC 1885 ms 103300 KiB
test_0095.txt AC 1888 ms 102108 KiB
test_0096.txt AC 1885 ms 103120 KiB
test_0097.txt AC 1883 ms 104152 KiB
test_0098.txt AC 1887 ms 102924 KiB
test_0099.txt AC 1883 ms 102200 KiB
test_0100.txt AC 1882 ms 104000 KiB
test_0101.txt AC 1884 ms 104012 KiB
test_0102.txt AC 1887 ms 103404 KiB
test_0103.txt AC 1888 ms 104776 KiB
test_0104.txt AC 1888 ms 104768 KiB
test_0105.txt AC 1886 ms 103380 KiB
test_0106.txt AC 1884 ms 105200 KiB
test_0107.txt AC 1886 ms 103064 KiB
test_0108.txt AC 1883 ms 102092 KiB
test_0109.txt AC 1887 ms 103740 KiB
test_0110.txt AC 1889 ms 102824 KiB
test_0111.txt AC 1889 ms 101248 KiB
test_0112.txt AC 1885 ms 103340 KiB
test_0113.txt AC 1893 ms 104124 KiB
test_0114.txt AC 1887 ms 105232 KiB
test_0115.txt AC 1887 ms 105132 KiB
test_0116.txt AC 1890 ms 101880 KiB
test_0117.txt AC 1888 ms 101556 KiB
test_0118.txt AC 1884 ms 101536 KiB
test_0119.txt AC 1887 ms 105848 KiB
test_0120.txt AC 1888 ms 102828 KiB
test_0121.txt AC 1886 ms 104272 KiB
test_0122.txt AC 1887 ms 101492 KiB
test_0123.txt AC 1888 ms 101836 KiB
test_0124.txt AC 1888 ms 101016 KiB
test_0125.txt AC 1886 ms 104288 KiB
test_0126.txt AC 1884 ms 103996 KiB
test_0127.txt AC 1885 ms 104448 KiB
test_0128.txt AC 1887 ms 102388 KiB
test_0129.txt AC 1886 ms 102988 KiB
test_0130.txt AC 1887 ms 101280 KiB
test_0131.txt AC 1891 ms 103844 KiB
test_0132.txt AC 1888 ms 102976 KiB
test_0133.txt AC 1888 ms 102508 KiB
test_0134.txt AC 1884 ms 102976 KiB
test_0135.txt AC 1887 ms 102292 KiB
test_0136.txt AC 1885 ms 102804 KiB
test_0137.txt AC 1892 ms 104044 KiB
test_0138.txt AC 1892 ms 101972 KiB
test_0139.txt AC 1882 ms 102540 KiB
test_0140.txt AC 1891 ms 104312 KiB
test_0141.txt AC 1889 ms 101992 KiB
test_0142.txt AC 1886 ms 103344 KiB
test_0143.txt AC 1891 ms 103660 KiB
test_0144.txt AC 1889 ms 106896 KiB
test_0145.txt AC 1894 ms 101948 KiB
test_0146.txt AC 1888 ms 104676 KiB
test_0147.txt AC 1886 ms 103364 KiB
test_0148.txt AC 1884 ms 102816 KiB
test_0149.txt AC 1889 ms 102860 KiB