#45076: 題解 附詳細註解的 Python Code


ericshen19555@gmail.com (暴力又被TLE)

學校 : 南光中學
編號 : 103121
來源 : [1.174.178.218]
最後登入時間 :
2025-01-08 19:15:31
q183. 3. 重組問題 -- 2025年1月APCS | From: [1.174.137.90] | 發表日期 : 2025-01-05 22:26

想法:
對於a尚未填數字的一個區間[i, j) 剩餘的差值們(就是題目給的那坨數字) 當中最大差值d只可能有兩種狀況:
1. d是與末項的差值(d = a[n-1] - a[i]) 故將 d 填在此區間的左側(a[i] = a[n-1] - d) 並縮減區間(i += 1)
2. d是與首項的差值(d = a[j-1] - a[0]) 故將 d 填在此區間的右側(a[j-1] = a[0] + d) 並縮減區間(j -= 1)
填入以後 需要檢查與已經填好的數字[0, i) U [j, n) 的差值是否相符
遞迴地重複上述動作 直到區間為空
解只會有兩個 只要找到其中一個答案 另外一個可輕易推出來

Python code
 
#45079: Re: 題解 附詳細註解的 Python Code


aadreamoon@gmail.com (AA 競程)

學校 : 不指定學校
編號 : 150530
來源 : [1.34.111.55]
最後登入時間 :
2024-11-17 18:31:36
q183. 3. 重組問題 -- 2025年1月APCS | From: [1.34.111.55] | 發表日期 : 2025-01-06 02:03

想法:
對於a尚未填數字的一個區間[i, j) 剩餘的差值們(就是題目給的那坨數字) 當中最大差值d只可能有兩種狀況:
1. d是與末項的差值(d = a[n-1] - a[i]) 故將 d 填在此區間的左側(a[i] = a[n-1] - d) 並縮減區間(i += 1)
2. d是與首項的差值(d = a[j-1] - a[0]) 故將 d 填在此區間的右側(a[j-1] = a[0] + d) 並縮減區間(j -= 1)
填入以後 需要檢查與已經填好的數字[0, i) U [j, n) 的差值是否相符
遞迴地重複上述動作 直到區間為空
解只會有兩個 只要找到其中一個答案 另外一個可輕易推出來

Python code

解只會有兩個是錯的,以下是一個反例:
0 1 2 6 8 11
0 1 6 7 9 11
0 2 4 5 10 11
0 3 5 9 10 11

這 4 個數列任兩個數的差的絕對值的多重集是一模一樣的。

但多數人可能還是會猜測「字典序最小的解和字典序最大的解必滿足字典序最小的解的第 i 項和字典序最大的解的倒數第 i 項之和為定值」,對於這件事我不知道有沒有反例  Q_Q

 
#45083: Re: 題解 附詳細註解的 Python Code


ericshen19555@gmail.com (暴力又被TLE)

學校 : 南光中學
編號 : 103121
來源 : [1.174.178.218]
最後登入時間 :
2025-01-08 19:15:31
q183. 3. 重組問題 -- 2025年1月APCS | From: [210.71.26.21] | 發表日期 : 2025-01-06 11:06

想法:
對於a尚未填數字的一個區間[i, j) 剩餘的差值們(就是題目給的那坨數字) 當中最大差值d只可能有兩種狀況:
1. d是與末項的差值(d = a[n-1] - a[i]) 故將 d 填在此區間的左側(a[i] = a[n-1] - d) 並縮減區間(i += 1)
2. d是與首項的差值(d = a[j-1] - a[0]) 故將 d 填在此區間的右側(a[j-1] = a[0] + d) 並縮減區間(j -= 1)
填入以後 需要檢查與已經填好的數字[0, i) U [j, n) 的差值是否相符
遞迴地重複上述動作 直到區間為空
解只會有兩個 只要找到其中一個答案 另外一個可輕易推出來

Python code

解只會有兩個是錯的,以下是一個反例:
0 1 2 6 8 11
0 1 6 7 9 11
0 2 4 5 10 11
0 3 5 9 10 11

這 4 個數列任兩個數的差的絕對值的多重集是一模一樣的。

但多數人可能還是會猜測「字典序最小的解和字典序最大的解必滿足字典序最小的解的第 i 項和字典序最大的解的倒數第 i 項之和為定值」,對於這件事我不知道有沒有反例  Q_Q


對我太笨qwq 可能會有多個解
最後這個 可以看皮皮大佬的證明

 
ZeroJudge Forum